Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 重命名文件和目录(添加前缀)_Linux_Perl_Shell - Fatal编程技术网

Linux 重命名文件和目录(添加前缀)

Linux 重命名文件和目录(添加前缀),linux,perl,shell,Linux,Perl,Shell,我想在所有文件夹和目录上添加前缀 例如: 我有 Hi.jpg 1.txt folder/ this.file_is.here.png another_folder.ok/ 我想添加前缀“PRE_u2;” 关于,多亏了,这里有一个适用于包含空格的文件名: for f in * ; do mv -- "$f" "PRE_$f" ; done (“--”是成功处理以破折号开头的文件所必需的,否则其名称将被解释为mv命令的开关)使用以下方式: $ rename 's/^/PRE_/' * 文件名中

我想在所有文件夹和目录上添加前缀

例如:

我有

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/
我想添加前缀“PRE_u2;”

关于,

多亏了,这里有一个适用于包含空格的文件名:

for f in * ; do mv -- "$f" "PRE_$f" ; done
(“--”是成功处理以破折号开头的文件所必需的,否则其名称将被解释为mv命令的开关)

使用以下方式:

$ rename 's/^/PRE_/' *
文件名中的元字符或空格没有问题。

如果您有Ruby(1.9+)

使用Perl:

perl -e 'rename $_, "PRE_$_" for <*>'
perl-e'rename$\,PRE$\'for'

这是一个简单的脚本,您可以使用。我喜欢使用非标准模块
File::chdir
来处理管理
cd
操作,因此要按原样使用此脚本,您需要安装它(
sudo cpan File::chdir


对于为文件(目录)添加前缀或后缀的,您可以通过xargs使用简单而强大的方法:

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

它正在使用xargs:-I的参数替换选项。您可以从手册页获得更多详细信息。

在我的系统上,我没有
重命名
命令。这是一个简单的单行程序。它递归查找所有HTML文件,并在其名称前添加
前缀

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

这可以通过运行一个简单的
find
命令来完成:

find * -maxdepth 0 -exec mv {} PRE_{} \;

上面的命令将在当前目录中的所有文件和文件夹前面加上
PRE_
,以便使用util linux的
rename
(与Debian和某些其他系统的perl变体
prename
)为当前目录中的所有文件和文件夹添加前缀,您可以执行以下操作:

rename '' <prefix> *
重命名“”*
这将查找空字符串的第一个匹配项(立即找到),然后用前缀替换该匹配项,然后将文件名的其余部分粘到该字符串的末尾。完成了


对于后缀,您需要添加或。

这将在其目录中为您的文件添加前缀

${f%/*}
是直到最后一个斜杠的路径
/
->目录

${f###*/}
是在最后一个斜杠前面没有任何内容的文本
/
->文件名,没有路径

事情就是这样的:

表示f,单位为$(find/directory/-type f);做
mv-v$f${f%/*}/$(日期+%Y%m%d)_前缀${f##*/}
完成

Heh,是的,如果文件中有空格,这将完全不起作用。如果将
ls
命令更改为
*
,并在
mv
的参数周围加上双引号,这将适用于包含空格的文件。@CanSpice是否可以用类似的脚本反转此操作(删除前缀)?谢谢,伙计。这里的实习生正在松开他的指套,重新命名所有67个文件。干杯。它应该是“mv--”而不仅仅是“mv”,以防止以破折号开头的文件被解释为命令开关。我将提供一个编辑来纠正这个问题。一些系统有一个名为“rename”的util linux实用程序,它的工作方式不同(在Ubuntu上称为“rename.ul”)。
rename
一直帮助我非常轻松地处理多个文件重命名。前缀中的@symbol有问题。需要\@但那很容易。工作正常。注意:如果您只想重命名当前目录的部分文件(目录),只需在xargs之前对其进行过滤,例如:
ls*.old | xargs-I{}mv{}PRE{}
,有趣的是,使用重命名不起作用。在我的RHEL设置中使用xargs很好,因此对于此选项,使用xargs+1可以很容易地理解该命令。如果文件名包含单引号,则该命令不起作用;如果失败,则使用:xargs:unmatched single quote;默认情况下,引号对于xargs是专用的,除非您将-0选项与
find
一起使用,否则您也可以执行命令,无需循环:
util linux
在Debian Stretch上似乎提供了
/usr/bin/rename.ul
。使用AWK作为答案:AWK'$0=“prefix”$0”file>new\u file
for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done
find * -maxdepth 0 -exec mv {} PRE_{} \;
rename '' <prefix> *