まだ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
一部のシステムには対応するコマンドがないため、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パターンを変更すると、実行中のファイルを調整でき、それを*
個別に使用してすべてのファイルで実行できます。