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