ディレクトリ内のデフォルト名は同じですが、拡張子が他のすべてのファイルを見つける方法は?たとえば、0001.jpg
and0001.png
とととと。0001.tiff
0002.jpg
0002.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
ここで唯一の答えはsed
ORperl
または正規表現を使用しているので、私はもう少し簡単なものを投稿すると思いました。
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
ファイル名に新しい行が含まれていると失敗します。