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 \;