シェルスクリプトを使用してファイルを削除する

シェルスクリプトではまったく初心者です。 私は2つのディレクトリにファイル名を比較し、同じ名前のファイルを削除する必要があります。

例えば:

Directory1/
one
two
three
four

Directory2/
two
four
five

スクリプトの実行後、ディレクトリは次のようになります。

Directory1/
one
three

Diretory2/
five

ありがとう

2
私はdiffディレクトリDirectory1/Directory2 /を試してみましたが、それは私には、各ディレクトリ内の単一のファイルではなく、重複したファイルを示しています。
追加された 著者 ulima69,
同じ名前だけが大丈夫です。私の場合、その内容は重要ではありません。トク。
追加された 著者 ulima69,
同じ名前のファイルを削除するだけでいいですか?異なるファイルには同じ名前を付けることができます。正しいアプローチは、ファイルが本当に重複しているかどうかを特定するために cksum または md5 を使用することです。
追加された 著者 jaypal singh,

2 答え

test -f tests if a file exists:

cd dir1
for file in *
do
    test -f ../dir2/$file && rm $file ../dir2/$file
done
cd ..
3
追加された

すばやく汚れた:

while read fname
do 
    rm -vf Directory{1,2}/"$fname"
done < <(sort 
              <(cd Directory1/ && ls) 
              <(cd Directory2/ && ls) | 
         uniq -d)

これはファイル名について多くのことを前提にしていますが、ここには入力と同様のケースがあります。

テスト済み、今:

mkdir /tmp/stacko && cd /tmp/stacko
mkdir Directory{1,2}
touch Directory1/{one,two,three,four} Directory2/{two,four,five}

コマンドを実行すると次のように表示されます。

removed `Directory1/four'
removed `Directory2/four'
removed `Directory1/two'
removed `Directory2/two'

結果として得られるツリーは次のとおりです。

Directory1/one
Directory1/three

Directory2/five
2
追加された
なぜ使用されるよりも2倍少ない<<?
追加された 著者 ulima69,
は入力リダイレクションを意味し、 <(cmd)はプロセスの置換を意味します(ファイル<記述子> のようなコマンドの出力を開きます)。したがって、 <<(cmd) cmd の出力を表す疑似ファイル(パイプ)からの入力をリダイレクトします。
追加された 著者 sehe,