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)
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.yo到dir第一,当我们重命名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。
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |