复制时如何重命名文件?


12

在重命名每个文件以从名称(即-2b0fd460_1426b77b1ee_-7b8e)中删除随机字符串部分的同时,如何将备份目录中的所有文件复制(不更改日期的归档样式)到用户目录?

cp来自:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

至:

/home/user/data/Erp.2014.02.16_16.57.03.etf

每个文件将始终以“ Erp”开头。然后是日期时间戳字符串,然后是随机字符串,然后是扩展名“ .etf”。我想保留所有名称元素,包括日期时间戳。我只想删除随机字符串。

随机字符串允许同一文件的多个备份。但是,在这种情况下,我只运行了fdupes,没有重复项。因此,我可以简单地还原所有文件,删除随机字符串。

我正在寻找单行bash命令来执行此操作。

如果那行不通,我可以分两个或两个以上的步骤来完成。我通常使用KRename,但在这种情况下,我需要使用bash进行操作。(我正在远程工作。)

Answers:


7

pax可以一次完成所有操作。您可以这样做:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

pax默认情况下,保留时间,但是可以添加-pe以保留所有内容(最好以root身份完成)或-pp保留权限,例如:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

否则(pax默认情况下通常不可用),一定要比a更好rename

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

这样,每个文件不会启动不同的进程。


1
我看到我需要熟悉pax。这看起来是一个非常有用的工具。让我想知道为什么它在更多发行版中不是标准的……
MountainX

@MountainX,根据Wikipedia的说法,这是一个好问题,pax自2005年以来一直在Linux Standard Base中。另外,可以替代的GNU cpio可能是现存功能最少的GNU工具。
Graeme 2014年

1
+1为您的最后一个解决方案,并且这种方式不会为每个文件启动不同的过程。 但是 rename在Fedora / Red Hat上却有所不同:在这种情况下,我不知道如何使用它。
erik 2014年

15

您可以将cp命令与-a选项一起使用

-a, --archive
       same as -dR --preserve=all

然后在复制文件时使用for循环重命名所有文件:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

准备。在源目录中启动此命令。

说明:%%-*一个连字符中第一次出现后,将切断所有字符/减-.etf在最后再加文件扩展名。

好吧,作为一个衬板,将它们全部放在一行中。:-) 像这样

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
谢谢,能否请您提供有关%%-*提示的文档?我很好奇。
soyuka 2015年

3

在zsh中,使用zmv。把它放在你的.zshrc

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

然后使用

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

在bash中:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

如果没有zsh,则POSIX方式将使用pax(这将以递归方式复制目录)。

如果您使用的是没有zsh和pax的受限系统,则可以使用循环:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cp没有那种能力。我记得cpio能够做到这一点,但是当前的联机帮助页却另有说明。但是,(gnu)tar确实可以--transform选择:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

因此,您将拥有如下命令:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.