私の問題:名前は同じですが、サブディレクトリに1レベルの深さで保存されたログファイルをコピーして名前を変更する必要があります。
複数のフォルダを含むLogfilesというフォルダからコピーしています。
W3SVC114
、、、、W3SVC1507562355
などW3SVC350179472
。
各フォルダには、次の名前のファイルが含まれています。u_ex[YYMMDD].log
ここで [YYMMDD] は日付スタンプです。
これらすべてのログファイルを1つのフォルダに配置する必要があります。すべての名前が同じなので、結果ファイル名にディレクトリ名を追加したいと思います。たとえば、次のようになります。
W3SVC1507562355/u_ex150407.log
~になるW3SVC1507562355_u_ex150407.log
これらすべてが起こるようにするにはどうすればよいですか?少し過度ではありません...:-/
答え1
ジッシュ名前付きzmv
これにより、ファイルを簡単に移動またはコピーし、パターンベースの変換を名前に適用できます。これをあなたのものに置きなさい.zshrc
(またはコマンドラインで実行しなさい):
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
その後、次のコマンドを使用して名前変更レプリケーションを実行できます。
zcp 'Logfiles/(*)/(*.log)' 'destination_directory/${1}_$2'
zcp -w 'Logfiles/*/*.log' 'destination_directory/${1}_${2}.log'
zcp -W 'Logfiles/*/*.log' 'destination_directory/*_*.log'
zshをインストールしたくない場合は、ループを使用してすべてのシェルで同じことを実行できます。
cd Logfiles
for x in */*.log; do
cp -- "$x" "destination_directory/${x%/*}_${x##*/}"
done
答え2
次のスクリプトを使用して、ファイルをある場所から別の場所にコピーして名前を変更できます。
注:次のスクリプトでは、2つの値をハードコードしています。
/ログファイル/:- ログファイル名をファイルのコピーが必要な有効なフォルダ名に変更します。
/tmp/:- これはファイルをコピーするディレクトリです。要件に応じてこのディレクトリの名前を変更します。
#!/bin/bash find /Logfiles/ -maxdepth 1 -type f | #find all files located under folder Logfiles with maxdepth one. while read FILEDIR #Read all files line by line. do DIR="${FILEDIR%/*}" # Get the folder name its inside # echo $DIR FILE="${FILEDIR/*\/}" # Get the plain file name. # echo $FILE NEWFILE="${DIR}"_"${FILE}" # set new filename. # echo $NEWFILE echo -e "coping $FILE from $DIR in /tmp with name $NEWFILE \n" cp $DIR/$FILE /tmp/$NEWFILE #copy file from old location to new location with modified name. done
答え3
そしてpax
:
pax -'rws|/|_|' -- */u_ex150407.log target/dir
pax
POSIX で指定した標準ファイルアーカイバーです。残念ながら - これは必須ですが、Linux標準ライブラリそしてすでに同じバージョンが増加しています。何らかの理由で、多くのディストリビューションでは、両方の標準で必要とされるデフォルトのインストールにパッケージ化されていません。非常に汎用性の高いツールなので、これが残念なことだと思います。
上で私はeadとriteモードpax
に入ると言いました。-r
-w
(コピーに翻訳)そして、出力ファイルに名前を付けるときにデフォルトで-s
標準BRE構文を実行できます。/
_
sed
(ここでは、左側のテキストの改行が許可されていることを除いて)ただし、この場合は詳細な説明は必要ありません。
とにかく、それはすべてです。何らかの理由でインストールされていない場合は、インストールして使用することをお勧めしますpax
。
答え4
簡単なPOSIXシェルの答え:
#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done
*/*.log
同じ名前と一致するすべてのファイルが移動され/
ます_
。