web-dev-qa-db-ja.com

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

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

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

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

8
Grimlockz

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に変換します。

警告:これを使用慎重にできればcopyあなたのディレクトリの、または最初にバックアップを取ることによって。警告されました!!最低限、最初にrename -nを使用します。これにより、実際に実行しなくても実行される処理が示されます。

9
user14408

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

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

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

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

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

1
rsaw

スクリプトを記述してファイル名を短くし、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)は、現在のディレクトリの下にあるすべてのファイルに再帰的に展開されます。

一部のシステムには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パターンを変更することにより、*を単独で使用してすべてのファイルで実行することで、実行するファイルを調整できます。

0
Spencer Rathbun

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

それはあなたがそのツールで直接いくつかの単純な名前変更タスクを行うことを可能にし、さらにより複雑な状況のための正規表現を可能にします。

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

0
Joe