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、设备、符号链接等。
我建议使用专用的批处理重命名工具,例如mmv
or 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 次 |
最近记录: |