在 Bash 脚本中重命名 + 移动嵌套文件

在 Bash 脚本中重命名 + 移动嵌套文件

我有一个目录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/

相关内容