使用cut命令从一组文件名中删除前n个字符

44

我正在使用

ls | cut -c 5-

这将以我想要的格式返回文件名列表,但实际上并没有执行操作。请给予建议。


25
如果您使用的是Mac或Linux系统,只需打开终端,切换到包含您的文件的文件夹,然后执行“for f in *; do mv "$f" "${f:5}"; done”命令。这将从该文件夹中的所有文件的文件名中删除前五个字符。 - Kebman
@Kebman,非常好,可以完美地运行。 但是如果我不使用CD命令并通过变量指定目录,则无法运行。代码如下: search_dir=/Users/veller/Desktop/folder; for entry in "$search_dir"/*; do mv "$entry" "${entry:5}"; done 它会给我以下错误提示:没有这个文件或目录。 - Fazwelington
使用for f in *.*在Kebman的评论中,以避免子文件夹。 - Ferroao
5个回答

79
rename -n 's/.{5}(.*)/$1/' *

-n 是用于模拟的,去掉它可以得到实际结果。


3
对于 macOS,您可以安装 brew https://brew.sh/,然后运行 brew install rename 来使用此功能。 - spex
这对我不起作用。我在我的文件夹上运行了它,但没有任何变化。 - Ibraheem Ahmed
4
看起来我使用的是linux-util版本的rename而不是perl脚本。对于任何arch用户,你需要安装官方的perl-rename软件包。 - Ibraheem Ahmed

32

当您在希望进行重命名的文件夹中时,可以使用以下命令:

rename -n -v  's/^(.{5})//' *

-n 是指没有实际操作,-v 用于显示即将进行的更改。如果您对结果满意,可以将两者都移除。

rename 's/^(.{5})//' *

12

这样的代码应该能够工作:

for x in *; do
    echo mv $x `echo $x | cut -c 5-`
done

请注意这可能具有破坏性,因此首先以这种方式运行它,然后一旦您确信它执行了您想要的操作,就删除前导的echo

1
如果删除第一个 echo 并按原样编写,那么只有当目录中仅包含名称不带空格且至少为6个字符长的文件时,才能正常工作而不出现错误。虽然双引号引用 $x 并使用 $(..) 代替传统的反引号用法可以解决文件名中包含空格的错误,但仅此还不能处理可能抛出的所有错误,例如如果文件名仅为5个字符长或存在目录。 - user3439894
4
回声命令将输出 "mv $x ${x:5}",其中 ${x:5} 是变量 x 的第五个字符到结尾的子字符串。这个命令会将变量 x 重命名为从其第五个字符开始的新名称。 - Ivan Kovtun
简单明了。您可以使用此命令在将mv命令添加到一行代码之前验证新文件名:for fn in *; do newfn=$(echo $fn | cut -c 19-); echo will move $fn to $newfn; done - JL_SO

3

Kebman的小代码很不错,如果你想在7zipping或zipping之前删除当前目录中隐藏文件和文件夹的前导点。

我把这个代码放在bash脚本中了,但这就是我的意思:

for f in .*; do mv -v "$f" "${f:1}"; done # cut off the leading point of hidden files and dirs

7z a -pPASSWORD -mx=0 -mhe -t7z ${DESTINATION}.7z ${SOURCE} -x!7z_Compress_not_this_script_itself_*.sh # compress all files and dirs of current dir to one 7z-file, excluding the script itself.

在当前目录顶层有隐藏文件时,zip和7z可能会遇到问题。 子目录中的隐藏文件则可以被接受。

mydir/myfile = ok
mydir/.myfile = ok
.mydir/myfile = nok
.mydir/.myfile = nok

2
如果你收到一个错误信息,内容是:

rename is not recognized as the name of a cmdlet

这个方法可能对你有用:
get-childitem * | rename-item -newname { [string]($_.name).substring(5) }

这是Windows的首选解决方案。与PowerShell配合使用效果很好。 - MERose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接