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/