使用 find 命令反转文件名更改?

sam*_*ers 3 linux grep find

Find 是一个很好的工具——而且用途广泛。我试图通过向现有文件名添加后缀或前缀来重命名文件。凉爽的。

find -name "*" -exec mv {} {}.yo \;

现在这是我无法获得的部分 -如果必须撤消上述操作,我该怎么做?

编辑 -
我注意到前缀是不可能的 - 是否有解决方案。

find  -type f -name "*"  -exec mv {} yu.{} \;
mv: cannot move './o.txt.yu.yu' to 'yu../o.txt.yu.yu': No such file or directory
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

find . -depth -name '*.yo' -exec sh -c '
  ret=0
  for file do
    mv -i -- "$file" "${file%.yo}" || ret=$?
  done
  exit "$ret"' sh {} +
Run Code Online (Sandbox Code Playgroud)

file.yo会将所有文件(任何类型的文件,包括您用来添加该.yo后缀的命令中的目录)重命名为file不带.yo. 我们首先做深度(他们是在分支前叶)否则如果重命名dir.yodir第一,当我们重命名dir.yo/file.yo,以dir.yo/file将无法工作作为dir.yo不复存在。

使用批量重命名时,-depth几乎总是更好,因此始终使用它是一个好习惯,唯一要记住的是它与-prune.

前缀 withmv {} prefix{}不起作用,因为{}包含包含目录组件的完整路径,而您想将前缀添加到文件名中,因此您需要以下内容:

find . -depth -type f -exec sh -c '
  ret=0
  for file do
    dir=${file%/*} name=${file##*/}
    mv -i -- "$file" "$dir/yu.$name" || ret=$?
  done
  exit "$ret"' sh {} +
Run Code Online (Sandbox Code Playgroud)

这次我们-type f只重命名常规文件,排除所有其他类型的文件,包括目录fifos设备符号链接等。

我建议使用专用的批处理重命名工具,例如mmvor zsh's ,而不是手动执行此类操作zmv

zsh

autoload -Uz zmv
zmv '(**/)(*).yo(#qD)' '$1$2'       # remove .yo suffix
zmv '(**/)(*)(#qD.)'   '${1}yu.$2'  # add yu. prefix to regular files
Run Code Online (Sandbox Code Playgroud)

(#q...)用于glob 限定符,其中D告诉 zmv 也像find默认情况下一样考虑隐藏文件或隐藏目录中的文件,并且.相当于find's -type f