web-dev-qa-db-ja.com

20文字のみのファイル名とファイル拡張子.txtを保持する方法

私はこのようなファイルがたくさんあります:

hhsLog.8020.20200330}1585594173}0}coll_DefaultCollectorGroup_1_158594166_132642}1036942}0}0

最初の20文字を保持して.txt拡張子。したがって、最終的には次の名前のファイルが必要です。

hhsLog.8020.20200330.txt

私はFedoraとSolarisの両方に取り組んでいます。

5
user221459

これは、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に尋ねます。

11
terdon

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.*
_
1
Kusalananda

これがうまくいきました:

for file in *
 do
 file2=$(echo ${file} | cut -c 1-20)
 mv ${file} ${file2}.txt
 done
0
user221459