Linux版のnamemanglerを見つけるのにあまり成功していません。Windowsで読めるように1000個のファイルの名前を変更する必要があります。
これを実行できるLinuxプログラムを知っている人はいますか?
そうでない場合、フォルダ内のすべてのファイルの名前をたとえば最初の16文字に変更するだけでよいため、スクリプトが機能する可能性があります。スクリプトルートを下る価値はあるかもしれませんが、どこから始めればよいかわかりません。
Linux版のnamemanglerを見つけるのにあまり成功していません。Windowsで読めるように1000個のファイルの名前を変更する必要があります。
これを実行できるLinuxプログラムを知っている人はいますか?
そうでない場合、フォルダ内のすべてのファイルの名前をたとえば最初の16文字に変更するだけでよいため、スクリプトが機能する可能性があります。スクリプトルートを下る価値はあるかもしれませんが、どこから始めればよいかわかりません。
回答:
Debian、Ubuntu、および派生物でman rename
は、コマンドプロンプトで入力すると、名前の変更に任意のPerlのような正規表現コマンドを使用できる名前変更ユーティリティのマニュアルページが表示されます。
たとえば、これは現在のディレクトリ内のすべてのファイルを5つの長さに(切り捨てることにより)短くします。
rename 's/^(.{5}).*/$1/' *
最初の5文字をキャプチャし、それを置換で使用して残りを削除することで機能します。
もう1つの例は、拡張子を維持しながらファイル名(sans拡張子)を5文字に短縮することです。
rename 's/^(.{5}).*(\..*)$/$1$2/' *
2つのグループをキャプチャします。最初のグループは最初の5文字、2番目のグループは拡張子です。これは、電源を入れますmyCarefullyCraftedDocument.pdf
にmyCar.pdf
。
警告:これは慎重に使用してください。できればディレクトリのコピーに使用するか、最初にバックアップを作成してください。警告されました!! 最低限、rename -n
最初に使用してください。実際に実行しなくても何が行われるかが表示されます。
スクリプトを記述して、ファイル名を短くし、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パターンを変更することで、実行するファイルを調整し*
、それ自体を使用してすべてのファイルで実行できます。
echo
パイプを使用する必要はなく(多くのファイルがある場合は非常に高価になる可能性があります)、代わりにheredocまたはherestringを使用します。
eval 'echo $BASH_SUBSHELL'
とeval 'echo $BASH_SUBSHELL' | cat
。
time
、ループをecho $i | sed
とを使用してループを実行しましたsed ... <<<$i
。ここで、ヒアストリングはエコーの約2/3の時間を要しました。
<<
here <i> doc </ i>を開始します。これは複数行であり、区切り文字が必要です。<<<
here <i> string </ i>を作成します。これは、1つの変数/文字列のみを取ります。ぜひお試しくださいvar=abc // cat<<<$var // cat <<$var
。