复制文件,以便将单个文件复制到文件名作为完整文件夹名称中的字符串的文件夹中

复制文件,以便将单个文件复制到文件名作为完整文件夹名称中的字符串的文件夹中

我使用 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'

相关内容