パスディレクトリに指定されているすべてのファイルの名前を大文字に変更するスクリプトをUbuntuで作成する必要があります。私はファイル名を変更するループを見つけましたが、ループにパスを渡す方法がわかりません。助けてください?
これはループです:
for f in *; do
mv "$f" "$f.tmp";
mv "$f.tmp" "`echo $f | tr "[:lower:]" "[:upper:]"`";
done
私はこのような道を通過しようとしました。
for f in path_to_dir* ...
しかし、それがすることは何とか.tmpディレクトリを作成するだけです。
答え1
私は次のことをします:
#! /bin/zsh -
ret=0
autoload zmv
for dir do
(cd -P -- "$dir" && zmv '*(#qN)' '$f:u') || ret=$?
done
exit "$ret"
スクリプト名は次のとおりです。
that-script /path/to/dir /path/to/other/dir...
答え2
for f in /path/to/dir*
私はあなたが似たようなことに代わっていたと思います/path/to/dir/*
。前者は/path/to
名前で始まるファイルとディレクトリを探しますdir
が、後者はディレクトリの内容を繰り返します。
tr
とにかく、使用するコマンドが変更されるため、これは役に立ちません。すべて、大文字を含む存在しない状態のまま/path/to/dir
です。/PATH/TO/DIR
良いニュースは、より簡単な方法でこれを行うことができることです。
Bashを使用している場合${var^^}
。だからあなたはこれを行うことができます:
for f in /path/to/dir/*; do
## get the file's name
name=$(basename -- "$f")
## make the new name
mv -- "$f" /path/to/dir/"${name^^}"
done
または、ディレクトリ名を2回入力したくない場合は、変数に保存できます。
targetPath="/path/to/dir"
for f in "$targetPath"/*; do
## get the file's name
name=$(basename -- "$f")
## make the new name
mv -- "$f" "$targetPath"/"${name^^}"
done
cd
ただし、この場合は、ターゲットディレクトリに直接移動して作業する方が簡単で明確です。
targetPath="/path/to/dir"
cd -- "$targetPath" &&
for f in *; do
mv -- "$f" "${f^^}"
done
または、新しいディレクトリで終わらないようにするには、サブシェルでループを実行します。
targetPath="/path/to/dir"
( cd -- "$targetPath" &&
for f in *; do
mv -- "$f" "${f^^}"
done
)
最後に、次のコマンドを使用してこれを行うこともできます(perl-rename
Ubuntuから呼び出され、インストールされていますrename
)sudo apt install rename
。
rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*
製造元は-n
実行せずrename
に実行するジョブのみを印刷します。それがうまくいくなら、-n
実際にファイル名を変更せずにもう一度実行してください。