私は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'