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.csvmv

이 경우 $i파일이나 폴더의 각 항목 이름이 포함됩니다./path/to/users/

관련 정보