我使用 Cygwin 作为 Linux shell,当前工作目录中有以下内容:
文件:
Abc.dat
123.dat
456.dat
目录:
W_Abc_w
W_123_w
W_456_w
现在我想复制文件如下:
Abc.dat -> W_Abc_w
123.dat -> W_123_w
456.dat -> W_456_w
如何在单行linux命令中实现这一点?我需要一个通用的解决方案,可以用于将来类似的情况......
目标目录始终存在,但文件名中的字符数会有所不同。目标目录名称将始终包含要复制的文件的文件名以及其他额外字符。目标目录名称具有唯一的模式,例如。 Abc_sa_file_name_1 第二个目录名称将为 Abc_sa_file_name_2。文件名也有模式,例如 kim_1。金_2。
我将把文件 kim_1 移动或复制到 Abc_sa_kim_1_1。我希望用一个命令来操作完整的模式。
答案1
在一个命令(行)中:
cp Abc.dat W_Abc_w/; cp 123.dat W_123_w/; cp 456.dat W_456_w/
尾部斜杠不是必需的,而是一种习惯,表明意图是将文件放入目的地目录不作为新的文件。
作为具有模式的通用循环:
for f in ???.dat
do
[ -d W_"${f%.dat}"_w ] && cp -- "$f" W_"${f%.dat}"_w
done
这将拾取后面带有三个字符的每个文件名,.dat
并将它们复制到相应命名的目录中(如果该目录已存在)。命令内的文件名扩展cp
会去掉尾随的.dat
.
如果您对不使用循环的命令行方法感兴趣 - 但也动作文件而不是副本他们——你可以使用 zsh:
autoload zmv
zmv '(???).dat' 'W_$1_w'