file..txt
、file2..txt
などのような不正な形式で名前が付けられた多数のファイルを含むディレクトリがあります...
では、この2番目の.
をファイル名から簡単に削除する方法は?
Awk、sed、grepなどを含む任意の適用可能な方法が高く評価されています...
rename
を使用します(heemaylの提案に従って、グロビングを、..txt
):
rename -n 's/(.*)\./$1/' *..txt
これにより、最後のドットまでファイル名が一致し、最後のドット以外のすべてで一致が置き換えられます。
結果が期待されたものである場合、-n
オプション:
rename 's/(.*)\./$1/' *..txt
私は実用的なソリューションを持っていますが、まだ良いもののために働いています:
for f in *; do mv $f ${f%.txt}txt; done
@ heemayl 注に感謝:
*を使用するのではなく、* .. txtを使用してファイルを取得してください。そして1つだけで
だから:
for f in *..txt; do mv $f ${f%.txt}txt; done
別のrename
バリアント:
rename 's/\Q.././' *..txt
\Q
を使用すると、ドットのエスケープが回避されます( http://perldoc.Perl.org/perlretut.html を参照)
これを行う非常に簡単な方法は、上記の形式uのファイル名を含むディレクトリ内で次のコマンドを実行するだけです。
rename 's/\.+txt/\.txt/' *
逆の順序を試すこともできます。これは、ファイル名に改行文字が含まれている場合に機能します。
rename 's/\.([^.]+)$/$1/' *..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 ---
$ 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 ---
シングルドットファイルがない場合、これは非常にうまく機能します。
for file in *; do mv "$file" "${file%%.*}${file#*.}"; done