Bash スクリプトでネストされたファイルの名前を変更して移動する

Bash スクリプトでネストされたファイルの名前を変更して移動する

各ユーザーの名前が付けられたフォルダーがたくさんあるディレクトリがありますusers。それらのフォルダー内に、というファイルがありuserinfo.csv、これをフォルダーから取り出して に取り込みたいと考えusersています。ユーザー フォルダー内のすべてのファイルは userInfo という名前なので、フォルダー内にあるユーザー名を含むように名前を変更したいと思います。次の操作を試しましたが、ユーザー名が完全なディレクトリであるため機能しません。ユーザー名に名前を変更することにこだわっているわけではありません。移動したときに1 つのファイルと多数のエラーだけが残らないよう$dirに、何か別の名前に変更する必要があります。users

これを改善するにはどうすればよいですか?

# for every subdirectory, copy userinfo.csv to /users and rename to avoid confusion/errors
for dir in /path/to/users/*/; do
    (
        cd "$dir" && cp userinfo.csv _$("dir").csv && cp _$("dir").csv /path/to/users/
    )
done

答え1

最終的なファイル名にユーザー名が必要ない場合は、

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/userinfo-$RANDOM.csv
done

あなたのユースケースには効果的でしょうか?

そうでない場合は、bash のパラメータ置換を使用することもできます。

for i in /path/to/users/*/userinfo.csv ; do
  mv $i /path/to/users/${i//\/-}
done

これにより、変数 (パス + ファイル名) 内の/すべての内容が置き換えられます。たとえば、次のようになります。-$i

/path/to/users/path-to-users-john-userinfo.csv
/path/to/users/path-to-users-jack-userinfo.csv

答え2

for i in $(ls -1 /path/to/users/); do
    mv /path/to/users/$i/*/userinfo.csv /path/to/users/userinfo_$i.csv
done

userinfo.csvこれは、場所が であると仮定して機能します。 にファイルがない、またはファイルのみのフォルダーが含まれている/path/to/users/$user/userinfo.csv場合、は何も実行しないため、無視できます。/path/to/users/userinfo.csvmv

この場合、ファイルまたはフォルダー内$iの各項目の名前が含まれます。/path/to/users/

関連情報