2つのディレクトリ間で同じファイル(名前で)をすべて検索して削除します

2つのディレクトリ間で同じファイル(名前で)をすべて検索して削除します

dir2 内の対応する同じファイル名を持つ dir1 内のすべてのファイルを検索し、それらを dir1 から削除します。

例えば:

dir1: first.txt second.txt
dir2: third.txt first.txt

dir1 first.txtだからファイルから削除したいのです。

Bash ターミナルを使用してこれを実現するにはどうすればよいでしょうか? (forループなどのスクリプトや「fdupes」のようなサードパーティ プログラムではありません)

答え1

スペースを含むファイル名を処理するには:

#!/bin/bash
OPWD=$(pwd)
cd "$1"
for MYFILE in "$2"/*
do
    if [ -f "${MYFILE##/*/}" ]
    then
        echo "removing ${MYFILE##/*/}"
        rm "${MYFILE##/*/}"
    fi
done
cd "$OPWD"

答え2

もう一つの簡単な例ですが、これも明示的なループはありません。忘れずに、これをテストするには、rm -fwith をプレフィックスとして付けることができます。echo

( cd dir2 && find . -maxdepth 1 -type f -print0 ) | ( cd dir1 && xargs -0 rm -f )

これをスクリプトに記述し、をdir1に置き換えます。"$1"dir2"$2"

答え3

素早い回答...

#!/bin/bash
#finddel dir1 dir2

for i in $(ls $1)
    do
    [ -f $2/$i ] && echo "Deleting $2/$i" && rm -f $2/$i
done

答え4

使用rsync

rsync --verbose --remove-source-files xyz/* .
pop3-2.dump
pop3-3.dump
pop3.dump
popcorn-build.log

sent 852,069,995 bytes  received 124 bytes  113,609,349.20 bytes/sec
total size is 851,861,745  speedup is 1.00

関連情報