各ユーザーの名前が付けられたフォルダーがたくさんあるディレクトリがあります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.csv
mv
この場合、ファイルまたはフォルダー内$i
の各項目の名前が含まれます。/path/to/users/