如何在复制时重命名文件?

Mou*_*inX 12 shell bash file-copy rename

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

cp来自:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf
Run Code Online (Sandbox Code Playgroud)

到:

/home/user/data/Erp.2014.02.16_16.57.03.etf
Run Code Online (Sandbox Code Playgroud)

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

随机字符串允许对同一文件进行多次备份。但是,在这种情况下,我只是运行了 fdupes 并且没有重复。所以我可以简单地恢复所有文件,删除随机字符串。

我正在寻找一个单行 bash 命令来做到这一点。

如果这不起作用,我可以分两步或更多步完成。我通常使用 KRename,但在这种情况下,我需要在 bash 中进行。(我在远程工作。)

eri*_*rik 15

您可以使用cp带有-a选项的命令

-a, --archive
       same as -dR --preserve=all
Run Code Online (Sandbox Code Playgroud)

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

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done
Run Code Online (Sandbox Code Playgroud)

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

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

好吧,作为一个班轮,把它全部放在一行中。:-) 像这样

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done
Run Code Online (Sandbox Code Playgroud)


Gra*_*eme 7

pax可以一次完成这一切。你可以这样做:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data
Run Code Online (Sandbox Code Playgroud)

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

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data
Run Code Online (Sandbox Code Playgroud)

否则(pax默认情况下通常不可用),当然最好复制然后复制rename

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf
Run Code Online (Sandbox Code Playgroud)

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