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

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

まだLinuxのバージョンが見つかりませんでした。名前変更者、Windowsで読み取れるように1000個のファイル名を変更する必要があります。

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

それ以外の場合は、フォルダ内のすべてのファイル名を最初の16文字に変更するため、スクリプトが機能する可能性があります。スクリプトパスを続ける価値があると思いますが、どこから始めるべきかわかりません。

答え1

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

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

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

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

別の例は、ファイル名(拡張子なし)を5文字に減らすことです。救う拡張子名:

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

それを捉える二つグループ、最初は最初の5文字、2番目は拡張子です。これはmyCarefullyCraftedDocument.pdfなりますmyCar.pdf

警告する:これを使う注意深い、好ましくはコピーディレクトリを選択するか、まずバックアップを作成します。あなたは警告を受けました! !少なくともrename -n最初に使用すると、実際に実行せずに何をするかを教えてくれます。

答え2

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

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

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

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 …。あるいは、zshでbashの代わりにzshを使用すると、**/*(od)より深くネストされたファイルから始まり、現在のディレクトリ内のすべてのファイルに再帰的に拡張されます。

答え4

一部のシステムには対応するコマンドがないため、renamepaxdiabloの回答に代わる方法は次のとおりですmv

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

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

関連情報