将文件与匹配的扩展名配对
假设我有以下文件列表:
a.1
a.2
a.3
b.1
b.2
是否有一个 bash 单行代码可以找到一个不存在具有相同扩展名的“b”的“a”文件? (即a.3:不匹配)
我确信我可以编写一个简短的 bash/perl 脚本来执行此操作。
但我想知道是否有任何“技巧”(当然,GNU 工具可供我使用;awk、sed、find ...)
Let's say I have this list of files:
a.1
a.2
a.3
b.1
b.2
Is there a bash one-liner that could find the one 'a' file for which there is no 'b' with the same extension? (i.e. a.3: no match)
I'm sure I could write a short bash/perl script to do this.
But I would like to know if there is any "trick" for this (of course, GNU tools are at my disposal; awk, sed, find ...)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(5)
老娘不死你永远是小三2024-11-04 00:36:05
如果你可以使用 Perl:
perl -le 'for (<a*>) { /(.*)\.(.*)/; print "$1.$2" if !-e "b.$2"}'
静若繁花2024-11-04 00:36:05
bash 版本 4 有关联数组,因此您可以这样做:
declare -A a_files
while read -r filename; do
ext="${filename##*.}"
case "${filename%.*}" in
a) a_files[$ext]="$filename" ;;
b) unset a_files[$ext] ;;
esac
done < <(ls [ab].*)
echo "non-matched 'a' files: ${a_files[@]}"
或者,使用 awk:
ls [ab].* | awk -F. '
$1 == "a" {a_files[$2] = $0}
$1 == "b" {delete a_files[$2]}
END {for (ext in a_files) print a_files[ext]}
'
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
你可以试试这个:
You could try this: