私はこのようなファイルがたくさんあります:
hhsLog.8020.20200330}1585594173}0}coll_DefaultCollectorGroup_1_158594166_132642}1036942}0}0
最初の20文字を保持して.txt
拡張子。したがって、最終的には次の名前のファイルが必要です。
hhsLog.8020.20200330.txt
私はFedoraとSolarisの両方に取り組んでいます。
これは、bash
のシェルループで簡単に実行できます。
cd /path/to/files/;
for file in *; do
echo mv -i -- "$file" "${file:0:20}.txt"
done
必要な処理が完了したら、エコーを削除して実際にファイルの名前を変更します。
cd /path/to/files/;
for file in *; do
mv -i -- "$file" "${file:0:20}.txt"
done
-i
は、新しい名前の1つがすでに存在するかどうかを上書きする前にmv
に尋ねます。
FedoraとSolarisはbashシェルをサポートしています:
'for'ループを使用すると、パスとファイル名を個別に処理せずに、言及されたパスの最初の20文字を処理しますが、実際のファイル名は処理しません。
したがって、これはあなたがやりたいことを正確に行い、サブディレクトリには行きません(サブディレクトリを処理したい場合は、 '-maxdepth 0'オプションを削除します:
find /path/of/the/files/* -maxdepth 0 -type f| xargs -I[] bash -c 'val="[]";file=${val##*/};newfile=${file:0:20};mv $val ${val%/*}/$newfile.txt'
Xargsの-Iオプションは、見つかった各ファイル名(パスを含む)を "[]"で置き換え、各[]->に対してbashコマンドを実行しますfilenameこれを$ val変数に格納し、パスとファイル名を抽出し、ファイル名の最初の20文字だけを取得して、「mv fullpath-with-filename fullpath-withoutfilename/first20charcters-of」のように移動します。 -ファイル名"。
すべての関連ファイル名が現在のディレクトリの_hhslog.*
_に一致すると仮定します。次に、Perl rename
ユーティリティを使用します。
_rename 's/(.{20}).*/$1.txt/' hhsLog.*
_
これは、Perl置換s/(.{20}).*/$1.txt/
を各ファイル名に適用します。これにより、名前が20文字で切り捨てられ、次に_.txt
_ファイル名サフィックスが追加されます。
最初の_}
_で名前を切り捨てるには、次を使用します
_rename 's/([^}]+).*/$1.txt/' hhsLog.*
_
または
_rename -n 's/(.+?)}.*/$1.txt/' hhsLog.*
_
Wordの文字でもドットでもない最初の文字で名前を切り捨てるには、次を使用します。
_rename 's/([\w.]+).*/$1.txt/' hhsLog.*
_
これがうまくいきました:
for file in *
do
file2=$(echo ${file} | cut -c 1-20)
mv ${file} ${file2}.txt
done