2017-08-10 14 views
4

/opt/dir/ABC/には複数のファイルがあり、allfile_123-abc allfile_123-def allfile_123-ghi allfile_123-xxxという名前が付けられています。bashを使って複数のファイルをディレクトリに移動するにはどうしたらよいですか?

は、私はファイルを私は上記$file = /opt/dir/ABC/allfile_123*ので動作しません知っているnew_name-abc.pgp new_name-def.pgp new_name-ghi.pgp new_name-xxx.pgpを命名して、/usr/tst/output

for file in /opt/dir/ABC/allfile_123* ; 
do mv $file /usr/tst/output/"$file.pgp"; 
rename allfile_123 new_name /usr/tst/output/*.pgp ; done 

に移動する必要があります。この作業を行うことは可能ですか、それとも 'for loop'ではなく別のコマンドですか?

これは、jilにbashを実行しているLinuxサーバーのコマンドラインに渡すコマンドが含まれているAutosysアプリケーション用です。

私の質問の各部分のバージョンを見つけることができましたが、それだけではありませんでした。私はこのjilのコマンドラインに残したいと考えていました。スクリプトが絶対必要でない限り。

+1

あなたが言います'/ opt/dir/ABC/allfile_123 *'は動作しません。 globパターンが正確であれば動作します。 '' $ file "'を参照する際には、 '' $ file "" /usr/tst/output/$file.pgp "'のように二重引用符を使用するべきですが、それはあなたの直ぐの問題ではありません。あなたは何をスクリプトに渡していますか? –

+0

私はスクリプトに何も渡していません。これはすべてコマンドライン上にあります。私が受け取っているエラーは 'mv:'/opt/dir/ABC/allfile_123-abc 'を '/usr/tst/output//opt/dir/ABC/allfile_123-abc.pgp'に移動できません:そのようなファイルはありませんファイル名が$ file "であれば、ファイル名は" $ file "になります。" – Emile

+0

'mv" $ file "/ usr/tst/output/new_name" $ {file#allfile_123} ".pgpは動作するはずです –

答えて

4

ループのための必要はありません、あなただけのrenamemvでこれを行うことができます。

rename -v 's/$/.pgp/' /opt/dir/ABC/allfile_123* 
rename -v s/allfile_123/new_name/ /opt/dir/ABC/allfile_123* 
mv /opt/dir/ABC/new_name* /usr/tst/output/ 

をしかし、私は、あなたが使用しているrenameは私と同じであるか分かりません。しかし 、 純粋なバッシュで行うのは簡単だ 、実行したい交換は非常に簡単ですから:

for file in /opt/dir/ABC/allfile_123*; do 
    newname=new_name${file##*allfile_123}.gpg 
    mv "$file" /usr/tst/output/"$newname" 
done 

あなたは、単一の行にそれを書きたい場合:

for file in /opt/dir/ABC/allfile_123*; do newname=new_name${file##*allfile_123}.gpg; mv "$file" /usr/tst/output/"$newname"; done 
+0

これはPerlベースの 'rename'(' prename'と呼ばれることもあります)のように見えます。問題のコードは他のバージョンを使用しているようです - 私はどこから来たのか正確にはわかりません(多分GNUのfileutilsかもしれません)。私は代替の愚かな機能を嫌い - 基本的に、私はPerlのバージョンを使用します。 –

+0

セミコロンを使用して同じ行の各行を区切り、 "mv can not stat/opt/dir/ABC/new_name *"というエラーが発生しました:そのようなファイルやディレクトリはありません – Emile

+0

@Emileエラーメッセージは、その接頭辞を持つファイル。名前の変更が機能しなかったか、名前を変更することはありませんでした。コマンドをステップバイステップで実行し、各ステップが期待通りに機能することを確認します。実際の解決策が得られたら、コマンドを連鎖するために '; 'の代わりに' && 'を使います。そうすれば、コマンドが失敗したときにコマンドのチェーンが停止し、残りのコマンドは実行されません。 – janos

関連する問題