bash - 拡張子に関係なく、同じ名前のすべてのファイルを検索する

bash - 拡張子に関係なく、同じ名前のすべてのファイルを検索する

2つの映画ライブラリをマージし、bashスクリプトを介して手動で「重複排除」したいと思います。

これまでの私の思考プロセスは次のとおりです。

  • 拡張子に関係なく、同じ名前のファイルをすべて検索
  • より小さなファイルを削除する(私は数日分のストレージスペースがあり、品質を好む!)

その上に積み重ねることができるので、削除された部分を何とか分離できれば、その上に積み重ねることができます。 ffmpegを使ってビデオを調べて、より良いものを選択することもできますが、大きいサイズ=最高のオプションであり、エンコードする方が簡単だと思います。

Software Recをリリースしましたしかし、私が望むものを手に入れなかったので、bashが最良の選択であることに気づきましたが、私の「検索」知識は限られており、私が見つけた回答のほとんどは複雑で、これが単純な問題であるべきだと思いました。

たとえば、名前は同じですが、内容の異なるファイルを探していますか?

ベストアンサー1

以下は、重複ファイルだけを探して拡張子を無視する私が書いた良い方法です。

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated

次に、このループにラップして、各ファイル内の2つのファイルのうち小さい方を見つけます。

for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done

最後に、もう1つのループを実行して(対話式でrm -i各ループの前にプロンプ​​トが表示されます)、次のファイルをすべて削除します。

for j in $(for i in $(find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated); do find . -name "$i*" -printf '%s %p\n' | sort -n | head -1 | cut -d ' ' -f 2-; done); do rm -i "$j"; done

findこれには、ディレクトリに対して2つのことを行うことが含まれるため、より良い方法が必要です。しかし、これは単純な場合には機能します。また、現在ディレクトリで作業しているとします。別のディレクトリでコマンドを実行するには、.両方findのコマンドのパラメータを変更するだけです。

おすすめ記事