配对具有匹配扩展名的文件

时间:2011-03-28 13:45:22

标签: bash find file-extension

假设我有这个文件列表:

A.1
A.2
A.3
B.1
b.2

是否有一个bash单行可以找到一个'a'文件,其中没有'b'具有相同的扩展名? (即 a.3:不匹配
我确信我可以编写一个简短的bash / perl脚本来执行此操作 但是我想知道是否有任何“技巧”(当然,GNU工具可供我使用; awk,sed,find ...)

5 个答案:

答案 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]}'