如何在 Linux 中使用 shell 重命名数千个目录,并删除以“it”开头的最后 9 个字符?

问题描述 投票:0回答:2

我需要更改一千个目录和子目录的名称,删除名称的最后 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}$) 保留了最后一个字符,我的案例不是重复的 谢谢

linux bash shell rename move
2个回答
1
投票

Bash 有变量替换,你可以使用:

for f in $(find ~/Downloads/damod -type d); do echo mv "$f" "${f/%-it*/}"; done

上面的命令实际上并没有重命名。它仅显示操作。 如果输出看起来不错,那么您可以删除“echo”部分并让它真正重命名。

${f/%-it*/}
表达式表示搜索后缀(由 % 符号表示)“-it*”并将其替换为空(第二个正斜杠后没有文本)。


0
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.