次のファイルがたくさんあります。
hhsLog.8020.20200330}1585594173}0}coll_DefaultCollectorGroup_1_158594166_132642}1036942}0}0
.txt
最初の20文字を維持し、拡張子を追加したいと思います。最終的には次のファイルが必要です。
hhsLog.8020.20200330.txt
私はFedoraとSolarisを使用しています。
答え1
シェルループを使用すると、これを簡単に実行できます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
上書きする前に、新しい名前の1つがすでに存在するかどうかを-i
尋ねます。mv
答え2
FedoraとSolarisはbashシェルをサポートしています:
そして「のための」場合によっては、パスとファイル名を別々に処理するのではなく、ループを実行すると、前述のパスの最初の20文字が処理されますが、実際のファイル名は処理されません。
したがって、サブディレクトリに移動せずに必要な操作を実行できます(サブディレクトリを処理するには、「-maxlength 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のオプションは、見つかったすべてのファイル名(パスを含む)を」[]「私たちはそれぞれでbashコマンドを実行しています。[]->ファイル名それをどこに保存しますか?$val変数を選択し、パスとファイル名を抽出し、「mv fullpath-with-filename fullpath-withoutfilename/first20charcters-of-filename」など、ファイル名の最初の20文字を個別に取得して移動します。
答え3
hhslog.*
現在のディレクトリのすべての関連ファイル名が一致すると仮定します。次に、Perlrename
ユーティリティを使用します。
rename 's/(.{20}).*/$1.txt/' hhsLog.*
これは、s/(.{20}).*/$1.txt/
各ファイル名にPerl置換を適用します。これにより、名前が20文字に切り捨てられ、ファイル名の.txt
サフィックスも追加されます。
名前を切り捨てるには、次}
を使用します。
rename 's/([^}]+).*/$1.txt/' hhsLog.*
または
rename -n 's/(.+?)}.*/$1.txt/' hhsLog.*
単語文字やドットではなく、最初の文字から名前を切り捨てるには、次のようにします。
rename 's/([\w.]+).*/$1.txt/' hhsLog.*
答え4
これは働きます:
for file in *
do
file2=$(echo ${file} | cut -c 1-20)
mv ${file} ${file2}.txt
done