假设我有这个文件列表:
A.1
A.2
A.3
B.1
b.2
是否有一个bash单行可以找到一个'a'文件,其中没有'b'具有相同的扩展名? (即 a.3:不匹配)
我确信我可以编写一个简短的bash / perl脚本来执行此操作
但是我想知道是否有任何“技巧”(当然,GNU工具可供我使用; awk,sed,find ...)
答案 0 :(得分:2)
你可以试试这个:
ls -1 [ab].* | sort -t . -k 2 | uniq -u -s2
答案 1 :(得分:2)
这是我的bash one-liner
for afile in a*; do bfile=${afile/a/b}; test -f $bfile || echo $afile; done
我喜欢上面的解决方案,因为它只使用bash而没有其他工具。但是,为了展示Unix工具的强大功能,下一个解决方案使用4:ls,sed,sort和uniq:
ls [ab]* | sed 's/b/a/' | sort | uniq -u
答案 2 :(得分:1)
如果你可以使用Perl:
perl -le 'for (<a*>) { /(.*)\.(.*)/; print "$1.$2" if !-e "b.$2"}'
答案 3 :(得分:1)
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]}
'
答案 4 :(得分:1)
红宝石(1.9 +)
$ ruby -e 'Dir["a.*"].each{|x|puts x if not File.exist? "b."+x.scan(/a\.(\d+)/)[0][0]}'