2012-05-10 18 views
22

をファイル名のプレフィックスを削除するには:どのようにどのように私は次の例のようにbashでファイル名のプレフィックスを削除することができますposixシェル

XY TD-11212239.pdf 

11212239.pdf 

すなわちを得るために、XY TD-を削除しますか?

+4

Linuxはカーネルです。あなたは実際に[bash]または[sh](または別のシェル)を代わりに使用していますか? – ArjunShankar

+0

@ Shahbazさんの編集:OPはおそらく 'シェル'を意味しましたが、これは実際には例えばCプログラムを書くことによっても可能です。私が意味することは、OPが彼が「殻」を意味するかどうかを明確にすることが良いということです。 – ArjunShankar

+0

@ArjunShankar、私はタイトルからシェルを削除しましたが、彼はコマンド( 'XYファイル名')を実行している方法で、私はまだ彼がシェルでそれをしたいと思っています。 – Shahbaz

答えて

26

あなたはほとんど情報を与えているが、あなたは、sed経由のパイプリストをすることができますが、bashでこれをやっていると仮定すると、プレフィックス削除する必要があるファイルのリストを持っている:例えば

を:

./generate_your_list_of_files | sed -e 's/^prefix//' 

やファイルのリストは、スペースで区切られている場合:

echo TD-file1 TD-file2.x.yt TD-file3-beep | sed -e 's/\<TD-//g' 

最初の1行の先頭にプレフィックスと一致すると私を削除t。 2番目の単語はTD-(または置換する他の接頭辞)に一致します。単語の先頭にあってすべての行のすべての一致で置き換えられた場合のみです。このしかし、危険な取得、例えばTD-file\ that\ TD-contains\ space.txtのようなファイルがサイドノートとしてfile\ that\ contains\ space.txt

なり、lsを使用してファイルのリストを取得できませんでした。 That's a horrible mistake。あなたはと協力し、一箇所以上に参照するファイルのリストを取得する必要がある場合、私は配列でそれらを置くことをお勧めしたい:

files=(*) 

、その後、この配列で動作します。

for file in prefix*; 
do 
    mv "$file" "${file#XY TD-}" 
done 
:により人気の要求(以下、単一のコメント)へ


は、ここ(@tripleeeのおかげで)XY TD-なプレフィックスが除去されたことで始まるディレクトリ内のすべてのファイルの名前を変更する方法です

+0

OPが元のファイルの名前を変更したい場合もあります。質問は実際にはあまりにも曖昧で十分に答えることはできません。 – ArjunShankar

+0

@ArjunShankar、私の編集を参照してください。 – Shahbaz

+2

BackticksでのLsの無用な使用。 XY TD - "*のファイルを意味します。 do' ... http://partmaps.org/era/unix/award.html#ls – tripleee

3

また名前を変更ツール

が自作

0でそれをインストールし使用することができます

その後、あなたの目標は、大量リネームを実行する場合は、すべてのファイル

rename -d prefix- *

+3

素敵なパワフルな[タグ:perl]ツール! –

1
$ s='XY TD-11212239.pdf' 
$ echo "${s#XY TD-}" 
11212239.pdf 

から「prefix-」を削除するには、ディレクトリ内から以下のコマンドを実行します。

while IFS= read -r -d '' filename; do 
    mv "$filename" "${filename#XY TD-}" 
done < <(find . -type f -name 'XY TD-*' -print0) 

<()は、POSIX shにはないbash拡張です。 find ... | whileという形式のパイプラインに置き換えることができます。

同様に、-print0は、POSIX findにはないGNU拡張です。POSIX findには、改行を含む名前にとって安全なファイルを見つけるための同等の方法はありません。そのため、置き換えが困難です。

2

他の回答に示されている部分文字列抽出に加えて、部分文字列置換を使用することもできます。ファイルを考える:

fn="XY TD-11212239.pdf" 

はその後、サブストリングの交換:

fn_new=${fn//*TD-/} 

はまた、あなたがやりたいだろう。

+0

これは今日の私の正気を救った。ありがとう。 –

20

あなたが言ったPOSIX BASH、Kornshell、Ash、Zsh、およびDashを含むシェル。幸いにも、これらのシェルはすべて、可変値のパターンフィルタを実行します。これらのPOSIXシェルは、4つの異なるパターンのフィルタリング使用

$ ls *.sh # Lists all files with a `.sh` suffix 

パターンでは、UNIX/Linuxのコマンドライン上*のようなものを持つファイルを指定するときに使用するものです

  • ${var#pattern}を - 削除しパターンと一致する左側からの最小の文字列。
  • ${var##pattern} - パターンと一致する左側から最大の文字列を削除します。
  • ${var%pattern} - 右側からパターンに一致する最小の文字列を削除します。
  • ${var%%pattern} - 右側からパターンに一致する最大の文字列を削除します。ここで

いくつかの例です:

foo="foo-bar-foobar" 
echo ${foo#*-} # echoes 'bar-foobar' (Removes 'foo-' because that matches '*-') 
echo ${foo##*-} # echoes 'foobar' (Removes 'foo-bar-') 
echo ${foo%-*} # echoes 'foo-bar' 
echo ${foo%%-*} # echoes 'foo' 

あなたは本当にあなたが欲しいものを説明していない、とあなたは、任意のコード例が含まれていなかったので、それは何だろう何かを思い付くことは困難ですあなたが欲しいもの。しかし、パターンフィルタリングを使用すると、ファイル名で何をしたいのかを正確に把握できます。

file_name="XY TD-11212239.pdf" 
mv "$file_name" "${file_name#*-}" # Removes everything from up to the first dash 
関連する問題