ファイル名のナビゲーション、コピー、変換

ファイル名のナビゲーション、コピー、変換

私の問題:名前は同じですが、サブディレクトリに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つの値をハードコードしています。

  1. /ログファイル/:- ログファイル名をファイルのコピーが必要な有効なフォルダ名に変更します。

  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

paxPOSIX で指定した標準ファイルアーカイバーです。残念ながら - これは必須ですが、Linux標準ライブラリそしてすでに同じバージョンが増加しています。何らかの理由で、多くのディストリビューションでは、両方の標準で必要とされるデフォルトのインストールにパッケージ化されていません。非常に汎用性の高いツールなので、これが残念なことだと思います。

上で私はeadとriteモードpaxに入ると言いました。-r-w(コピーに翻訳)そして、出力ファイルに名前を付けるときにデフォルトで-s標準BRE構文を実行できます。/_sed(ここでは、左側のテキストの改行が許可されていることを除いて)ただし、この場合は詳細な説明は必要ありません。

とにかく、それはすべてです。何らかの理由でインストールされていない場合は、インストールして使用することをお勧めしますpax

答え4

簡単なPOSIXシェルの答え:

#!/bin/sh
for i in */*.log
do mv "$i" "${i//\//_}"
done

*/*.log同じ名前と一致するすべてのファイルが移動され/ます_

関連情報