我需要更改一千个目录和子目录的名称,删除名称的最后 9 个字符。最后 9 个字符以“它”开头。
示例:193-105kg-dal-brasile-it8petfo7 到 193-105kg-dal-brasile
我试过以下命令:
find /Users/myuser/Downloads/damod -type d -iname '*' mv "$i" "${i:50: -2}"
我使用 osx,我安装了 Brew。我非常感谢任何帮助。
我已经看过建议的案例,在文章中用这个公式 (.{48}$) 保留了最后一个字符,我的案例不是重复的 谢谢
Bash 有变量替换,你可以使用:
for f in $(find ~/Downloads/damod -type d); do echo mv "$f" "${f/%-it*/}"; done
上面的命令实际上并没有重命名。它仅显示操作。 如果输出看起来不错,那么您可以删除“echo”部分并让它真正重命名。
${f/%-it*/}
表达式表示搜索后缀(由 % 符号表示)“-it*”并将其替换为空(第二个正斜杠后没有文本)。
使用
find
与 sed
和 xargs
:
find "$test_dir" ! -path "$test_dir" -type d -print0 | sed -z 'p;s/.\{10\}$//' | xargs -0 -n 2 mv
对于数以千计的文件,您可以使用
xargs -P
开关来启用并行处理。使用最多 4 个并行进程的示例:
find "$test_dir" ! -path "$test_dir" -type d -print0 | sed -z 'p;s/.\{10\}$//' | xargs -0 -n 2 -P 4 mv
-- 或 --
使用
find
和 bash 进程替换来循环目录并重命名它们:
while IFS= read -r -d '' d ; do
mv "$d" "${d::${#d}-10}"
done < <(find "$test_dir" ! -path "$test_dir" -type d -print0)
注意:OP 表示希望删除尾随的 9 个字符,但 OP 的示例显示删除了 10 个字符(包括原始示例目录名称中的最后一个“-”)。
示例脚本:
#!/bin/bash
test_dir=""
setup() {
test_dir=$(mktemp -d -p .)
for i in {1..9} ; do mkdir "${test_dir}/19$i-105kg-dal-brasile-it8petfo$i" ; done
}
cleanup() {
rm -rf "$test_dir"
}
list_dirs() {
while IFS= read -r -d '' d ; do
printf "%s\n" "$d"
done < <(find "$test_dir" ! -path "$test_dir" -type d -print0) | sort
}
trap cleanup EXIT
setup
list_dirs
# while IFS= read -r -d '' d ; do
# mv "$d" "${d::${#d}-10}"
# done < <(find "$test_dir" ! -path "$test_dir" -type d -print0)
find "$test_dir" ! -path "$test_dir" -type d -print0 | sed -z 'p;s/.\{10\}$//' | xargs -0 -n 2 -P 4 mv
list_dirs
输出:
./tmp.V0s210g0PM/191-105kg-dal-brasile-it8petfo1
./tmp.V0s210g0PM/192-105kg-dal-brasile-it8petfo2
./tmp.V0s210g0PM/193-105kg-dal-brasile-it8petfo3
./tmp.V0s210g0PM/194-105kg-dal-brasile-it8petfo4
./tmp.V0s210g0PM/195-105kg-dal-brasile-it8petfo5
./tmp.V0s210g0PM/196-105kg-dal-brasile-it8petfo6
./tmp.V0s210g0PM/197-105kg-dal-brasile-it8petfo7
./tmp.V0s210g0PM/198-105kg-dal-brasile-it8petfo8
./tmp.V0s210g0PM/199-105kg-dal-brasile-it8petfo9
./tmp.V0s210g0PM/191-105kg-dal-brasile
./tmp.V0s210g0PM/192-105kg-dal-brasile
./tmp.V0s210g0PM/193-105kg-dal-brasile
./tmp.V0s210g0PM/194-105kg-dal-brasile
./tmp.V0s210g0PM/195-105kg-dal-brasile
./tmp.V0s210g0PM/196-105kg-dal-brasile
./tmp.V0s210g0PM/197-105kg-dal-brasile
./tmp.V0s210g0PM/198-105kg-dal-brasile
./tmp.V0s210g0PM/199-105kg-dal-brasile