查找文件并重命名并移动到另一个目录

查找文件并重命名并移动到另一个目录

当我运行命令时

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(此处为shshell),我们打开它是为了为mv移动 &rename 的命令提供/构建必要的参数,并为此使用它的参数扩展功能。

使用sh -c '...' sh_mv {},它接受两个参数,一个是sh_mv(用作我们打开的内联shell的标签(参数$0));该{}参数将是命令找到的文件名的替换find,并将作为下一个参数(参数$1)传递。

笔记:删除echo我们用于空运行测试的实际 mv。

相关内容