web-dev-qa-db-ja.com

ファイル名から重複したドットを削除します

file..txtfile2..txtなどのような不正な形式で名前が付けられた多数のファイルを含むディレクトリがあります...

では、この2番目の.をファイル名から簡単に削除する方法は?

Awk、sed、grepなどを含む任意の適用可能な方法が高く評価されています...

1
Maythux

renameを使用します(heemaylの提案に従って、グロビングを、..txt):

rename -n 's/(.*)\./$1/' *..txt

これにより、最後のドットまでファイル名が一致し、最後のドット以外のすべてで一致が置き換えられます。

結果が期待されたものである場合、-nオプション:

rename 's/(.*)\./$1/' *..txt
5
kos

私は実用的なソリューションを持っていますが、まだ良いもののために働いています:

for f in *; do mv $f ${f%.txt}txt; done

@ heemayl 注に感謝:

*を使用するのではなく、* .. txtを使用してファイルを取得してください。そして1つだけで

だから:

for f in *..txt; do mv $f ${f%.txt}txt; done
4
Maythux

別のrenameバリアント:

rename 's/\Q.././' *..txt

\Qを使用すると、ドットのエスケープが回避されます( http://perldoc.Perl.org/perlretut.html を参照)

4
Sylvain Pineau

これを行う非常に簡単な方法は、上記の形式uのファイル名を含むディレクトリ内で次のコマンドを実行するだけです。

rename 's/\.+txt/\.txt/' *
2
jerry

逆の順序を試すこともできます。これは、ファイル名に改行文字が含まれている場合に機能します。

rename 's/\.([^.]+)$/$1/' *..txt
2
Avinash Raj

ファイル名には改行文字を含めることができるため、次のようになります。

find . -maxdepth 1 -type f -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}txt"; done

$ find -exec  printf "%s ---" {} \;
. ---./foo
..txt ---./foo..txt ---

$ find . -maxdepth 1 -type f -print0 | \
    while read -d $'\0' f; do mv "$f" "${f%.txt}txt"; done

$ find -exec  printf "%s ---" {} \;
. ---./foo
.txt ---./foo.txt ---
1
A.B.

シングルドットファイルがない場合、これは非常にうまく機能します。

for file in *; do mv "$file" "${file%%.*}${file#*.}"; done
1