一括検索とコピー

一括検索とコピー

macOSには拡張子が.csvのファイルを見つけるスクリプトがあります。次に、強制的にバックアップしてファイルをコピーします。しかし、bashコンパイラは文句を言います。

find -E . -regex './.*csv' -type f -wholename '.*' -exec cp -f -r {} {} \;

例えば、次のような結果が出力されます。

cp: ./banknotes.csv and ./banknotes.csv are identical (not copied).
cp: ./crabs.csv and ./crabs.csv are identical (not copied).
cp: ./dogmandibles.csv and ./dogmandibles.csv are identical (not copied).
cp: ./winequality-white-3.csv and ./winequality-white-3.csv are identical (not copied).
...

そして、これらのファイルのどれもコピーされません。目的は、.csv拡張子を持つファイルを見つけて、同じディレクトリでそのファイルのコピーを実行することです。したがって、重複したファイルがあります。

修正する:

たとえば、見つかったファイルを列挙して増加する正の整数値を追加したい場合:

find . -name '*.csv'| while ((i++)); read lines; do echo $lines | sed -E "s|[^\.]*$|$i.csv|g" | xargs -I{} cp $lines {} ; done

ただし、特定の番号を追加するには、次の手順を実行します。

find . -name '*.csv'| while read lines; do sed -E "s|[^\.]*$|2.csv|g" | xargs -I{} cp $lines {}  ; done

最初はファイル出力に対して次のことを行います。

file_x.csv
file_y.csv
file_x.1.csv
file_y.2.csv

2番目のオプションは次のことを行います。

file_x.csv
file_y.csv
file_x.2.csv
file_y.2.csv

答え1

同じディレクトリに同じ名前の2つのファイルを含めることはできません。同じファイルなので不可能です。最善の方法は、別の名前でバックアップコピーを作成することです。また、あなたは-wholenameここで役に立つことはありません。ファイル名にaが含まれていることを確認するだけです。.ただし、を探しているので、-regex ./.*csvすべての結果はaで始まり、すべての./結果が一致します.*

また、./*.csv正規表現は、.で終わるファイルだけをインポートするcsvのではなく、名前で終わるすべてのエントリと一致します。ただ使用すると、よりシンプルで簡単です。このコマンドは、現在のディレクトリとサブディレクトリでcsv拡張子を持つすべてのファイルを検索します。.csv.csv-regex-regex './.*\.csv-name

find . -name '*.csv'

同じ名前を維持しながら.csv.bak拡張子を追加して各ファイルのバックアップコピーを作成するには、次の手順を実行できます。

find . -name '*.csv' -exec cp {} {}.bak \;

関連情報