ファイル名を短縮するLinuxスクリプトまたはプログラム


8

Linux版のnamemanglerを見つけるのにあまり成功していません。Windowsで読めるように1000個のファイルの名前を変更する必要があります。

これを実行できるLinuxプログラムを知っている人はいますか?

そうでない場合、フォルダ内のすべてのファイルの名前をたとえば最初の16文字に変更するだけでよいため、スクリプトが機能する可能性があります。スクリプトルートを下る価値はあるかもしれませんが、どこから始めればよいかわかりません。


2
おそらく、それを実行するPython、Perl、Ocaml、Rubyのスクリプトをすばやく作成できます。

長いファイル名を許可するvfatファイルシステムを使用できないのはなぜですか?
wnoise

2
好奇心から、名前はどのくらいの長さで、Windowsで認識されないのは何ですか?
Bobby

回答:


10

Debian、Ubuntu、および派生物でman renameは、コマンドプロンプトで入力すると、名前の変更に任意のPerlのような正規表現コマンドを使用できる名前変更ユーティリティのマニュアルページが表示されます。

たとえば、これは現在のディレクトリ内のすべてのファイルを5つの長さに(切り捨てることにより)短くします。

rename 's/^(.{5}).*/$1/' *

最初の5文字を​​キャプチャし、それを置換で使用して残りを削除することで機能します。

もう1つの例は、拡張子を維持しながらファイル名(sans拡張子)を5文字に短縮することです。

rename 's/^(.{5}).*(\..*)$/$1$2/' *

2つのグループをキャプチャします。最初のグループは最初の5文字、2番目のグループは拡張子です。これは、電源を入れますmyCarefullyCraftedDocument.pdfmyCar.pdf

警告:これは慎重に使用してくださいできればディレクトリのコピーに使用するか、最初にバックアップを作成してください。警告されました!! 最低限、rename -n最初に使用してください。実際に実行しなくても何が行われるかが表示されます。


1
これはPDFのように接頭辞を取り除きますか?同じ名前のファイルが短くなるとどうなりますか?

その特定の例は、そうです。拡張子をそのままにする正規表現を作成できます。答えを更新します。また、既存のファイルを上書きしないように保護するため、後で名前を変更しても失敗します。

これについてあなたの助けをありがとう-私は非常に感謝しています。PDFの一部が5に名前変更される場合、1つのわずかな問題があります。同じ名前で名前を変更しようとするPDFに何が起こるかを言いましょう。これらは、これですべてのものに一意の番号を追加できる方法ですか?以下を参照してくださいename -n 's / ^(。{5})。*(\ .. *)$ / $ 1 $ 2 /' * Annexes 123114345234525.pdfがAnnex.pdfに名前が変更されましたAnnexes 123114432452352.pdfがAnnex.pdfに名前が変更されました

@Grimlockz、私はあなたがその種の知性を名前変更正規表現自体に入れることができる思いません。何ISは知性のその種とラップリネームするスクリプトを記述行う必要があり、そしてあなたがより多くの人々がちょうどI.よりも応答が得られますので、それは、より良い別の質問として尋ねます

@Grimlockzこれが、正規表現ですべてを実行したくない理由です。正規表現を使用するスクリプトを作成する方が幸福であり、良いでしょう。
スペンサー

3

競合するファイルを他のディレクトリに移動できます:

for i in *
do
    j=${i:0:16}

    if [ -e "$j" ]
    then
        mv "$i" /path/to/rename/later
    else
        mv "$i" "$j"
    fi
done

1

スクリプトを記述して、ファイル名を短くし、Windowsがbashの数行で気に入らない文字を削除することができます。警告、テストされていないコードがブラウザに直接入力されました。

shopt -s dotglob extglob
for x in *; do
  y=${x//+([!-!#$%&'().0-9@A-Z^_`a-z{}~])/_}  # change all problematic characters to _
  if [[ $y = .* ]]; then y=_${y#.}; fi        # change dot files to begin with _
  y=${y:0:16}                                 # truncate names
  y=${y,,}                                    # convert to lowercase
  if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then
    # The file exists or is a DOS/Windows reserved name.
    # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here)
    i=1
    if [[ $y =~ \. ]]; then
      prefix=${y%%.*}; suffix=.${y#*.}
    else
      prefix=$y; suffix=
    fi
    y=${prefix}~$i$suffix
    while [[ -e $y ]]; do
      ((++i))
      y=${prefix}~$i$suffix
    done
  fi
  mv -- "$x" "$y"
done

サブディレクトリに再帰する必要がある場合は、からシェルスクリプトを呼び出しますfind -depth -exec …。または、bashの代わりにzshを使用します。zshでは**/*(od)、現在のディレクトリの下にあるすべてのファイルに再帰的に展開され、より深くネストされたファイルが最初に表示されます。


1

この種のシェル/ python / perlスクリプティングは問題ありませんが、GUIアプリがあなたに最適であるように思われるので、他の多くのことの中で、まさに何でもできるpyRenamerをお勧めします(単純な一般的な操作)プリセット[スペースを削除する、ファイル名をあるポイントから別のポイントに切り捨てる]、単純な検索/置換、複雑な正規表現、プレビューアなど)を介して。

ディストリビューションのソフトウェアリポジトリに含まれている場合もあります(Fedoraの場合)。


0

一部のシステムにはrenameコマンドがありません。そのため、paxdiabloの答えの代わりに、で同じことを行う方法を次に示しmvます。

for f in *.pdf; do 
    tmp=`echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/'`
    mv -b ./"$f" ./"$tmp"
done

-b移動中のフラグは、削除または上書きされるファイルのバックアップを作成します。forループのglobパターンを変更することで、実行するファイルを調整し*、それ自体を使用してすべてのファイルで実行できます。


1
echoパイプを使用する必要はなく(多くのファイルがある場合は非常に高価になる可能性があります)、代わりにheredocまたはherestringを使用します。
クリスダウン

1
@ChrisDown こちらをご覧くださいwikiの記事によると、パイプ処理されたプロセスはforkされていますが、独自のシェルで実行することについては何も述べられていません。
Spencer Rathbun、2012

1
例えば、間の違いに気付くeval 'echo $BASH_SUBSHELL'eval 'echo $BASH_SUBSHELL' | cat
クリスダウン

2
私はクイックテストを行ってtime、ループをecho $i | sedとを使用してループを実行しましたsed ... <<<$i。ここで、ヒアストリングはエコーの約2/3の時間を要しました。
ケビン

1
@SpencerRathbunはい。<<here <i> doc </ i>を開始します。これは複数行であり、区切り文字が必要です。<<<here <i> string </ i>を作成します。これは、1つの変数/文字列のみを取ります。ぜひお試しくださいvar=abc // cat<<<$var // cat <<$var
ケビン

0

ファイル名の変更を実験する必要があり、システムにKDEライブラリがインストールされている(またはそれらを追加してもかまわない)場合は、krenameを確認してください。

これを使用すると、ツールを使用してかなりの数の単純な名前変更タスクを直接実行でき、より複雑な状況での正規表現も可能です。

名前の変更条件を作成するときに、名前が変更されたファイルのプレビューが表示されます。また、同じファイルの名前を再度変更することもできます。これは、段階的に行うことで各段階の複雑さをすぐに理解できるような複雑なものにしたい場合に役立ちます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.