Linux

複製文件,以便將單個文件複製到具有文件名的文件夾作為完整文件夾名稱中的字元串

  • November 30, 2019

我使用 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。我希望在一個命令中操作完整的模式。

在一個命令(行)中:

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'

引用自:https://unix.stackexchange.com/questions/553216