スクリプトは、パスディレクトリで指定されたすべてのファイルの名前を変更します。

スクリプトは、パスディレクトリで指定されたすべてのファイルの名前を変更します。

パスディレクトリに指定されているすべてのファイルの名前を大文字に変更するスクリプトを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-renameUbuntuから呼び出され、インストールされていますrenamesudo apt install rename

rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*

製造元は-n実行せずrenameに実行するジョブのみを印刷します。それがうまくいくなら、-n実際にファイル名を変更せずにもう一度実行してください。

関連情報