我有从sample1到sample31的31个目录,具有类似的命名文件。

❯ find . -maxdepth 2 -type f
./sample5/palette-david-clode-2B4dYFgYAyQ-unsplash.thumbnail.jpg
./sample5/david-clode-2B4dYFgYAyQ-unsplash.jpg
./sample5/david-clode-2B4dYFgYAyQ-unsplash.thumbnail.jpg
./sample2/amy-syiek-0n9lbdiAKi0-unsplash.jpg
./sample2/amy-syiek-0n9lbdiAKi0-unsplash.thumbnail.jpg
./sample2/palette-amy-syiek-0n9lbdiAKi0-unsplash.thumbnail.jpg
./sample3/marc-meyer-9JE6BLqMYYM-unsplash.thumbnail.jpg
./sample3/palette-marc-meyer-9JE6BLqMYYM-unsplash.thumbnail.jpg
./sample3/marc-meyer-9JE6BLqMYYM-unsplash.jpg
...more files

现在我想

  • 将所有以palette-开头的文件更改为palette.jpg。 例如: ./sample5/palette-david-clode-2B4dYFgYAyQ-unsplash.thumbnail.jpg./sample5/palette.jpg

  • 将所有以.thumbnail.jpg结尾的文件更改为sample.jpg。 例如: ./sample5/david-clode-2B4dYFgYAyQ-unsplash.thumbnail.jpg./sample5/sample.jpg

如何在终端上执行此操作?

我试过了但是没用:

for dir in */; do; for file in "palette-*.jpg"; do mv "$file" "palette.jpg"; done;for file in "*.thumbnail.jpg"; do mv "$file" "sample.jpg";done;done

结果:

mv: rename palette-*.jpg to palette.jpg: No such file or directory
mv: rename *.thumbnail.jpg to sample.jpg: No such file or directory
mv: rename palette-*.jpg to palette.jpg: No such file or directory
mv: rename *.thumbnail.jpg to sample.jpg: No such file or directory
mv: rename palette-*.jpg to palette.jpg: No such file or directory
...
分析解答

扩展的通配符包括目录名称。要重命名文件但将其保留在同一目录中,请保留目录名称。您当前的尝试将目录和名称替换为一个文件名,从而有效地将所有文件移动到当前目录。

for dir in */; do
    for file in "$dir"/palette-*.jpg; do
        mv "$file" "$dir/palette.jpg"
    done
    for file in "$dir"/*.thumbnail.jpg; do
        mv "$file" "$dir/sample.jpg"
    done
done

还请注意,通配符必须位于引号之外。

显然,如果任何通配符匹配多个文件,则循环中的最后一个mv将覆盖该目录中的所有先前的通配符。