web-dev-qa-db-ja.com

ターミナルのファイル拡張子を無視してファイルの名前を変更するにはどうすればよいですか?

ビデオファイルのフォルダがいくつかあり、それらを同じ名前に変更する必要があります。例:foldername.videotypexvideonumber.avi。これを簡単にするために、シェルスクリプトを作成することを検討しました。これを行うには、mvコマンドが最適な方法のようです。

しかし、私が見たすべてのガイド/チュートリアル/マンページには、ファイルの名前を変更するときにファイル拡張子も含める必要があると書かれています。通常はこれで問題ありませんが、一部のフォルダーには、.mkvや.aviなどの複数のファイルタイプのビデオや、.rmvbファイルも含まれます。

そのため、ターミナルでファイルの名前を変更する方法があるかどうかを知る必要がありますwithoutそうするときにファイルタイプを指定する必要があります-基本的には、拡張子が何であるかに関係なく同じままになるようにするためです名前を変更する前に。

2
Saladin Akara

クイックアンサー:

拡張子はファイル名の一部であるため、それはできません。

長答:

グラフィカルインターフェイスを使用して、purrrまたはgprenameとして高度な名前変更を行うことができます。

だが!

バッチ名前変更スクリプトでは、次のファイル名分割技術を使用できます。

FULLFILENAME="/home/user/video/myvideo-release.xvid.128kbps.avi"
DIRNAME=$(dirname ${FULLFILENAME})   #-- /home/user/video
BASENAME=$(basename ${FULLFILENAME}) #-- myvideo-release.xvid.128kbps.avi
FILENAME=${BASENAME%.*}              #-- myvideo-release.xvid.128kbps
EXTENSION=${BASENAME##*.}            #-- avi
1
Lin

何をしたいのかを正確に知っておくと役立ちますが、これは確かにできます。 BASHパラメーター展開 について学ぶことはおそらくかなり必要です。

何をするかに応じて、拡張子とファイル名を分離する必要がある場合とそうでない場合があります。

問題のファイルがあるフォルダーに既にcdedされていると仮定します。

case 1:すべてのファイル名で文字列「bad」を「good」に変更するとします。次に、単純な置換を使用できます。つまり、次のようなことができます。

for file in * ; do mv "$file" "${file//bad/good}" ; done

(badからgoodに変更すると、既にそこにあるものが上書きされるという変更がないことを確認してください。)これは、拡張子に関係なく機能します。

ケース2:拡張子の前に「新しい」を追加する必要がある場合は、それが何であれ、次の操作を実行できます。

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

拡張子は、それが何であれ同じままです。

もっとアドバイスをしますが、繰り返しますが、あなたが何をしようとしているのか正確にはわかりません。

1
frabjous
[temp] λ = ls
test.doc  test.rtf  test.txt
[temp] λ = for f in *; do mv "$f" test2`echo "$f" | sed 's/[^.]*//'`; done
[temp] λ = ls
test2.doc  test2.rtf  test2.txt

よりエレガントな方法があるかもしれませんが、うまくいきます

test2をカウンターなどに置き換えます。

0
nvm