私はこれを行い、多くの重複バックアップファイルを削除したいファイルのリストを得ました。
find . -type f -name '._*'
そのファイル名のファイルを探したい
/home/masi/._test.tex
マッチ/home/masi/test.tex
/home/masi/math/lorem.png
マッチ/home/masi/math/._lorem.png
保存するファイルの疑似コードに対応するfilename
ものがありますが、保存されませ._filename
んfilename
。._filename
find . -type f -name '._*' -exec \
find filenameWithoutDotUnderscore, if yes, print the filename
疑似コード 2 削除するファイルの説明 = 対応するファイルが存在するか._filename
どうかfilename
- とが同じディレクトリに存在する場合は、
filename
重複した=を削除できるように印刷します。._filename
._filename
._filename
filenamePart1_.filenamePart2
、、...bok_3A.pdf
にあるものを除きます。._filename
- 同じディレクトリにそのエントリがない場合は
._filename
削除しないでください。filename
ワイルドカードを確認するコマンド
これを行いましたが、あまりにもfind . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +
多くのファイルが返されました。&&
存在確認に加えて、条件()がさらに必要なようです[ -e "$f" ]
。大きな違いがあると思われる場合は、ここでいくつかの内容を比較し、最後に比較することをお勧めします。
システム:Ubuntu 16.04とDebian 8.25
Bash:4.3.42
検索:4.7.0
ベストアンサー1
を使用してこれを行うことができますが、find
これを強力にするには、シェルシングルライナーも含める必要があります。これを行う正しい方法は次のいずれかです。
結果シェルにループを埋めます。
find . -type f -name '._*' -exec sh -c 'for a in "$@"; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf %s\\n "$f"; done' find-sh {} +
または、テストするファイルごとに別々のシェルを作成します(非効率的ですが、潜在的に読みやすくなります)。
find . -type f -name '._*' -exec sh -c 'f="${1%/*}/${1##*/._}"; [ -e "$f" ] && printf %s\\n "$f"' find-sh {} \;
バックアップファイルを直接削除するには、次のように変更します。テスト実行:
find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +
それから一度満足すれば印刷されたコマンドのリストを表示するには、次のようにします。
find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && rm -- "$a"; done' find-sh {} +
メモ:
これらのすべてでは、パラメータはランダムなfind-sh
文字列です。ここに何でも入れることができます。これは$0
生成されたシェルに設定され、エラー報告に使用されます。
for a in "$@"; do
と全く同じですfor a; do
。