2017-08-15 14 views
-2

スクリプトを使用して、UNIXのフォルダ内のファイルの名前を変更したいとします。
元のファイルの形式は次のとおりです。UNIXのファイル名を変更する

abc.txt.temp

と私はそれを名前を変更したい:

abc.txt

多くのファイルがこの形式を使用して、私は.TEMPを削除したいです元のファイル名から削除します。

+0

ショー': 'MMVを "* .txt.temp" "#の1.TXT"' – RomanPerekhrest

+0

出力をprename'

rename .temp '' *.temp 

または

rename 's/\.temp$//' *.temp 

+1

可能な重複[フォルダ内のファイルの一括リネーム用のシェル/バッシュショートカット](https://stackoverflow.com/questions/8416990/shell-bash-shortcut-for-bulk-renaming-of-files-in-a-folder) – Fabien

答えて

2

にシプリアンが与えた答えは確かにオプションですが、私はそれが限界だと感じ。 以下の解決策は、実際に何かを数える必要がなく、最後だけでなく任意の位置からテキストを取り除くことができるので、はるかに柔軟です。

for filename in *; do mv "$filename" "${filename//.temp/}"; done 

「*」現在のフォルダ内のすべてのファイルを意味します

次のコマンド(1行)は、すべてのファイルに.TEMPの一切の言及を削除します。 * .tempを使用すると、Ciprianの方法とまったく同じ結果を得ることができます。 (つまり、.tempで終わるファイルから.tempを取り除くだけです)

+0

はうまく動作します。私はすぐにたくさんのファイルの名前を変更することができました。 1ライナーで! – Ritesh

+0

うれしい私は助けることができました!私はこのコマンドを自分で使いましたが、いつも私が探していた結果が得られました:) 私の答えに「受け入れられた」とフラグを立てると、他の人が答えを早く見つけることができるようになります。 $ *のファイル名は –

+0

です。 mv "$ filename" "$ {filename //。temp /}"を実行します。これは正常に動作します。しかし、100個のファイルと特定の日付のみを名前変更したいのであれば、これは面倒です。スクリプトの日付をパラメータとして渡す方法はありますか?それはファイル名を渡すことなく、その日付のファイルの名前を変更するだけです – Ritesh

-1

'rename.sh' のような名前で以下のスクリプトを作成します。

#!/bin/bash 

TARGET_DIR=$1 
TARGET_FILES="$TARGET_DIR/*.temp" 

for fileName in $TARGET_FILES 
do 
    newFileName=${fileName::-5} 
    mv -v "${fileName}" "${newFileName}" 
done 

ノート${var:offset:length}拡大は、bashのバージョン4以降が必要です。

はそれを実行権限を付与します。

chmod a+x rename.sh 

あなたはそれを呼び出し、パラメータとして.TEMPファイルのディレクトリの名前を渡す必要があります。このようにそれを呼び出します。

./rename.sh /path/to/the/temp-files 

スクリプトは、ターゲットフォルダ内のすべての* .TEMPファイルをループファイルパスから最後の5つの文字を抽出し(「.TEMPが」5つの文字である)と、元のファイルを移動します拡張子として.tempが含まれていない新しいファイルにコピーします。

EDIT:テストCentOSの7

+0

部分文字列式<0エラー – Ritesh

+0

@Ritesh、mvコマンドに冗長モードを追加しました。スクリプトを修正してもう一度実行してください。 mvコマンドに-vオプションがあることに注意してください。その後、出力を表示してください。私はファイル名の問題を疑っていますが、正確にはそれを確認する必要があります。 –

+0

おそらく関係があります:: - :) –

1

私はUNIXについてよく分かりませんが、質問にはLinuxタグが含まれているため、UNIX/Linuxの混乱の可能性があります。

ほとんどのGNU/Linuxディストリビューションにはrenameコマンドがあります。あなたが望む、あなたのケースでは

rename 's/foo/bar/' files 

renameバージョンによっては、構文がいずれかのような単純な

として
rename foo bar files 

かもしれbarfiles内の名前とfooを交換するか、sedの正規表現の構文に従ってください.tempをすべてのファイルの空の文字列('')に置き換えます。renameバージョンに応じて、これらのコマンドのいずれかが動作するはずです。

あなたは `mmv`ツールを使用することをお勧めします
関連する問題