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/

관련 정보