Abd*_*red 6 command-line filesystems find
我有一个文件系统树,其中的不同位置是同名的文件。我在命令行上尝试了以下命令:
find / -name "HAHA" -exec mv {} /home \;
Run Code Online (Sandbox Code Playgroud)
它仅适用于一个文件,对于其他文件,我收到了具有相同名称的错误消息。
我可以更改命令,为每个文件名附加一个数字来区分它们吗?

Tbl*_*lue 11
我可以想到两种可能的解决方案:
如果您是mv从GNU coreutils安装的(可能是这种情况),那么以下命令...
find / -name "HAHA" -type f -exec mv --backup=numbered "{}" /home \;
Run Code Online (Sandbox Code Playgroud)
...将所有文件移动HAHA到/home. 该--backup=numbered 选项的mv保证,每一次mv命令执行时,它会检查是否已经存在一个文件名为HAHA在目标目录-如果确实如此,那么它首先将其重命名为HAHA.~n~(其中n移动新的文件之前是越来越多)到/home. 最终,你将最终命名为喜欢的文件HAHA,HAHA.~1~,HAHA.~2~等。在/home。
这个 shell 脚本应该可以解决问题,但它不能抵抗包含换行符的路径:
IFS="
" # if you are using bash, you can just use IFS=$'\n' here
i=1
for file in $(find / -name "HAHA" -type f); do
mv "${file}" "/home/HAHA${i}"
i=$((${i} + 1))
done
Run Code Online (Sandbox Code Playgroud)
这将迭代所有HAHA文件并将每个文件移动到/home/HAHAn,其中n再次增加数字,从 1 开始。
我找到了一个带有小脚本的简单解决方案。该脚本被称为cpf(或您给它起的任何名称),如下所示:
#!/bin/bash
dir=xyz # Directory where you want the files
num=1
for file in "$@"
do
base=`basename -- "$file"`
mv -- "$file" "$dir/$base.$num"
num=$(($num+1))
done
Run Code Online (Sandbox Code Playgroud)
您执行命令如下:
find . -name HAHA -print0 | xargs -0x cpf
Run Code Online (Sandbox Code Playgroud)