デフォルト名は同じですが、拡張子が異なるファイルを探す

デフォルト名は同じですが、拡張子が異なるファイルを探す

ディレクトリ内のデフォルト名は同じですが、拡張子が他のすべてのファイルを見つける方法は?たとえば、0001.jpgand0001.pngとととと。​0001.tiff0002.jpg0002.png

答え1

すべての一意のファイル名が必要な場合は、次のようにします。

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq

これらのファイルの複数を同じデフォルト名で指定するには、次のようにします。

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

ピリオドが複数あるファイル名の場合は、次のコマンドを使用します。

ls -1 | sed 's/\(.*\)\..*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

答え2

ソリューションの活用ls(出力の解析を避けており、この操作のために設計されておらず、エラーが発生する可能性があります):

perl -E '
    while (<*>){
        ($full, $short) = (m/^((.*?)\..*)$/);
        next unless $short;
        push @{ $h->{$short} }, $full;
    }
    for $key (keys %$h) {
        say join " ", @{ $h->{$key} } if @{ $h->{$key} } > 1;
    }
' /home/sputnick

または希望のディレクトリ/home/sputnickに置き換えてください。).

答え3

ここで唯一の答えはsedORperlまたは正規表現を使用しているので、私はもう少し簡単なものを投稿すると思いました。

for file in /path/to/your/files/*; do echo ${file%%.*}; done | uniq -d

この例では、${file%%.*}ファイルパスは最初のピリオド(.)と一致します。したがって、0001.tar.gz考慮されるでしょう0001

出力は次のとおりです

/path/to/your/files/0001
/path/to/your/files/0002

フルパスが出力に表示されないようにするには、cdまずディレクトリに移動し、アスタリスク(*)のみをパスとしてコマンドを実行します。

cd /path/to/your/files
for file in *; do echo ${file%%.*}; done | uniq -d

その後、出力は次のようになります。

0001
0002

答え4

解析を恐れていない場合ls:

/bin/ls --color=no -1 | sed 's/\.[^.]*$//' | uniq -d

ファイル名に新しい行が含まれていると失敗します。

関連情報