web-dev-qa-db-ja.com

別のディレクトリにあるディレクトリ内のファイルを削除する

これを使用してディレクトリをコピーしました:

cp -r dir/ ../../

考えずに、実際にはdirではなくdirの内容を上記のディレクトリにコピーしたことに気づきました。これで、cpを正しくやり直すことができるように、削除する必要のあるファイルが散らかっています。特に一致しない場合、誤ってコピーしたすべてのファイルを削除するにはどうすればよいですか?

6
n0pe

わかりました、これは基本的に klapauciusの答え と同じです。 (また、cpが既存のファイルを上書きした場合に発生した損傷は修復されません。)

ソースディレクトリ(dir内)にいると仮定します。このコマンド:

find . -type f echo '{}' ';'

dirディレクトリに存在するすべてのファイルを(再帰的に)一覧表示します(-print)。 -type fオプションは、サブディレクトリのリストを防ぐためにあります。

したがって、使用する場合:

find dir -type f -exec echo '../../../{}' ';'

これにより、ターゲットディレクトリ内の対応するファイル(コピー)が一覧表示されます。

これで、リストが正しければ、次を使用してコピーを削除できます。

find dir -type f -exec rm -- '../../../{}' ';'

cp…hum…から来る残りの空のディレクトリを取り除くことに関して

6

find-execと組み合わせて使用​​します。このようにする前に、lsでより良いテストを行ってください。

find . -name "*" -exec ls ../../{} \;
2
klapaucius

次のコードは、フルバージョンのスクリプトを paste.ubunt に配置した改行が埋め込まれたファイル名を処理します。存在と一致するサイズをチェックします...テストデータを生成するためのコードもそこに含まれています。

# This lists the original fully-qualified filename, 
# and its would-be counterpart (assuming it exists) 
unset a i
while IFS= read -r -d $'\0' relf; do
    printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}"
done < <(find  . -type f  \! -name '.' -name '*' -print0)

これはフルバージョン(上記)のサンプル出力で、1つのファイルが欠落していて、別のファイルのファイルサイズが元のファイルとは異なります。

WARNING -----
NOT in target   ./file1
ok --------
sizes match     ./c/file4-in-subdir
WARNING ------
size mis-match  ./file3   is   triple-spaced
ok --------
sizes match     ./file2
has newline!
2
Peter.O