在 Bash 中删除文件名中间的前导零

在 Bash 中删除文件名中间的前导零

这是我遇到的一个简单问题,但我不太擅长,sed因此任何快速帮助将不胜感激。

我使用split.结果,所有单位数块都有一个前导零(例如BRNSPC_varID_chunk_07.txt)。我想删除下划线后面的前导零,使其看起来像这样:BRNSPC_varID_chunk_7.txt。我不想影响任何尾随零(即我想BRNSPC_varID_chunk_70.txt保留BRNSPC_varID_chunk_70.txt)。有人可以帮我快速重命名所有这些文件吗?它导致我的 R 脚本出现错误,我不知道如何在 R 中处理。

另外,其中一个文件只是BRNSPC_varID_chunk_00.txt.我希望就这样BRNSPC_varID_chunk_0.txt

谢谢

答案1

给定

$ touch BRNSPC_varID_chunk_07.txt BRNSPC_varID_chunk_00.txt BRNSPC_varID_chunk_70.txt

那么至少在bash, ksh,zsh

$ for f in ./*chunk_0?.txt; do echo mv "$f" "${f/chunk_0/chunk_}"; done
mv ./BRNSPC_varID_chunk_00.txt ./BRNSPC_varID_chunk_0.txt
mv ./BRNSPC_varID_chunk_07.txt ./BRNSPC_varID_chunk_7.txt

echo一旦您确信它会做正确的事情,就将其删除。

chunk如果没有歧义(即,如果序列_0不能出现在名称中的其他位置),则可以删除前缀。

还有许多其他不太便携的解决方案等renamemmv例如使用renamefrom util-linux

rename.ul -n -v chunk_0 chunk_ ./*chunk_0?.txt

(删除-n以实际重命名)。

答案2

使用rename

rename 's/(BRNSPC_varID_chunk_)0([0-9])/$1$2/' *.txt

*.txt将扩展到.txt当前目录中的所有文件。

重命名将查找包含BRNSPC_varID_chunk_0[0-9]第一个匹配组所在位置BRNSPC_varID_chunk_和第二个匹配组是尾随的任何文件[0-9],它将仅用第一个和第二个匹配组替换它(消除中间的零)。

答案3

这是选择正确的正则表达式来匹配要替换的字符串的问题。

您已使用 sed 标记了该问题。

在 中sed,使用 ERE 语法(以避免几个\):

s#(chunk_)0+([0-9]+\.)#\1\2#

这将替换文本chunk_(并将其捕获为第一个反向引用\1),后跟任意数量(至少一个)的(前导)零,0+后跟任意数量的数字(至少一个),后跟一个点\.并转换与反向引用\1\2(删除几个前导零)。

使用较旧但更可移植的语法,它是:

s#\(chunk_\)0\{1,\}\([0-9]\{1,\}\.\)#\1\2#

这将转换:

for file in ./BRNSPC_varID_chunk*.txt; do
    filenew=$(echo "$file" | sed -E 's#(chunk_)0+([0-9]+\.)#\1\2#')
    echo mv -n "$file" "$filenew"
done

使用 sed 仅在不支持正则表达式的 shell 上才有意义。

在 bash 中,你可以这样做:

regex='(.*chunk_)0+([0-9]+\..*)'

for file in ./BRNSPC_varID_chunk*.txt; do
    if [[ $file =~ $regex ]]; then
        filenew=$(IFS=;printf '%s' "${BASH_REMATCH[@]:1}") 
        echo mv -n "$file" "$filenew"
    fi
done

这将打印这种类型的列表:

mv -n ./BRNSPC_varID_chunk_000000.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_0000.txt   ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00011.txt  ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_000.txt    ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00.txt     ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_010.txt    ./BRNSPC_varID_chunk_10.txt
mv -n ./BRNSPC_varID_chunk_011.txt    ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_012.txt    ./BRNSPC_varID_chunk_12.txt
mv -n ./BRNSPC_varID_chunk_013.txt    ./BRNSPC_varID_chunk_13.txt
mv -n ./BRNSPC_varID_chunk_014.txt    ./BRNSPC_varID_chunk_14.txt
mv -n ./BRNSPC_varID_chunk_015.txt    ./BRNSPC_varID_chunk_15.txt
mv -n ./BRNSPC_varID_chunk_01.txt     ./BRNSPC_varID_chunk_1.txt
mv -n ./BRNSPC_varID_chunk_02.txt     ./BRNSPC_varID_chunk_2.txt
mv -n ./BRNSPC_varID_chunk_03.txt     ./BRNSPC_varID_chunk_3.txt
mv -n ./BRNSPC_varID_chunk_04.txt     ./BRNSPC_varID_chunk_4.txt
mv -n ./BRNSPC_varID_chunk_05.txt     ./BRNSPC_varID_chunk_5.txt
mv -n ./BRNSPC_varID_chunk_06.txt     ./BRNSPC_varID_chunk_6.txt
mv -n ./BRNSPC_varID_chunk_07.txt     ./BRNSPC_varID_chunk_7.txt
mv -n ./BRNSPC_varID_chunk_08.txt     ./BRNSPC_varID_chunk_8.txt
mv -n ./BRNSPC_varID_chunk_09.txt     ./BRNSPC_varID_chunk_9.txt
mv -n ./BRNSPC_varID_chunk_0.txt      ./BRNSPC_varID_chunk_0.txt

请注意,它正确处理一些零。

相关内容