我有一个目录users
,其中充满了为每个用户命名的文件夹。在这些文件夹中,有一个名为的文件userinfo.csv
,我想将其从文件夹中取出并放入users
.由于用户文件夹中的每个文件都称为 userInfo,因此我想将其重命名以包含该文件夹中的用户名。我尝试了以下方法,但它不起作用,因为其中的用户名$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/