![查找文件并重命名并移动到另一个目录](https://linux22.com/image/920994/%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E5%B9%B6%E9%87%8D%E5%91%BD%E5%90%8D%E5%B9%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95.png)
当我运行命令时
find dir_1 -type f -name 'f*'
我在那里找到了 2 个文件“file_11”和“file_22”。现在我想使用“find”命令中的 -exec 将这些文件移动到另一个目录“dir_2”。所以我使用这个命令。
find dir_1 -type f -name 'f*' -exec mv {} ../dir2 \;
该命令有效。
现在,目录“dir_1”中也有一些“.txt”文件。我想将这些文本文件移动到“dir2”,并重命名这些文件。所以我使用这个命令,
find dir_1 -type f -name '*.txt' -exec mv {} ../dir2/new_{} \;
但我收到了错误,
mv: cannot move 'dir_1/file1.txt' to '../dir2/new_dir_1/file1.txt': No such file or directory
mv: cannot move 'dir_1/file2.txt' to '../dir2/new_dir_1/file2.txt': No such file or directory
谁能帮我。
答案1
find dir_1 -type f -name '*.txt' -exec \
sh -c 'echo mv "$1" "/path/to/dir_2/new_${1##*/}"' sh_mv {} \;
语法${parameter##word}
是个shell 参数扩展。和 cuts-up-to-last-prefix 指定为单词从其给定參數;这里它剥离了小路文件名中的部分。因此./dir_1/sub_directory/file1.txt
变为刚刚file1.txt
添加new_
至文件名。
该sh -c '...'
构造称为内联 shell(此处为sh
shell),我们打开它是为了为mv
移动 &rename 的命令提供/构建必要的参数,并为此使用它的参数扩展功能。
使用sh -c '...' sh_mv {}
,它接受两个参数,一个是sh_mv
(用作我们打开的内联shell的标签(参数$0
));该{}
参数将是命令找到的文件名的替换find
,并将作为下一个参数(参数$1
)传递。
笔记:删除echo
我们用于空运行测试的实际 mv。