フルフォルダ名にファイル名が文字列のフォルダに単一のファイルがコピーされるようにファイルをコピーします。

フルフォルダ名にファイル名が文字列のフォルダに単一のファイルがコピーされるようにファイルをコピーします。

私はCygwinをLinuxシェルとして使用しており、現在の作業ディレクトリに次のものがあります。

文書:

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

1行のLinuxコマンドでこれをどのように達成できますか?今後同様の状況で使用できる一般的なソリューションが必要です。

宛先ディレクトリは常に存在しますが、ファイル名の文字数は異なります。ターゲットディレクトリ名には、常にコピーするファイルのファイル名とその他の追加文字が含まれています。宛先ディレクトリ名には一意のパターンがあります。 Abc_sa_file_name_1 2番目のディレクトリ名はAbc_sa_file_name_2です。ファイル名にもkim_1のようなパターンがあります。ゴールド_2。
kim_1ファイルをAbc_sa_kim_1_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

これにより、すべてのファイル名の後に3文字が続き、.datその名前のディレクトリにコピーされます(そのディレクトリがすでに存在する場合)。コマンド内のファイル名拡張子は、次のcp拡張子が削除されます.dat

ループを使用せずにループを使用しないコマンドラインアプローチに興味がある場合行動代わりにファイルコピーそれら - zsh を使用できます:

autoload zmv
zmv '(???).dat' 'W_$1_w'

おすすめ記事