查找并批量复制

查找并批量复制

我在 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

而第二个选项将执行以下操作:

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

答案1

同一目录中不能有两个同名的文件。这是不可能的,因为它们是同一个文件。您能做的最好的事情就是使用不同的名称创建备份副本。另外,您的-wholename, 在这里没有做任何有用的事情,它只是确保文件名包含 a.但由于您正在寻找-regex ./.*csv,所有结果都将以 开头,./因此所有结果都会匹配.*

此外,正则表达式./*.csv匹配当前目录中名称以 结尾的任何内容csv,而不仅仅是以.csv.要仅获取以您结尾的文件,.csv-regex需要-regex './.*\.csv.但不要。只需使用-name,它更简单、更容易。此命令将查找当前目录及其子目录中所有具有 csv 扩展名的文件:

find . -name '*.csv'

现在,要为每个文件创建备份副本,保持相同的名称,但为其添加.csv.bak扩展名,您可以执行以下操作:

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

相关内容