![{1..10}을 사용하여 일련 번호로 파일 이름을 바꿀 수 있습니까?](https://linux55.com/image/110133/%7B1..10%7D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9D%BC%EB%A0%A8%20%EB%B2%88%ED%98%B8%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BF%80%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
질문이 있습니다. 일련번호 1부터 10까지 파일 이름을 바꿔야 합니다. 다음 매개변수를 사용하여 파일을 생성할 수 있습니다.
touch file.$(date +%Y).$$.{1..10}
하지만 다음 명령을 사용하여 파일 이름을 바꿀 수 없습니다. {1..10}이 허용되지 않는 이유. 파일 이름을 . mv 명령은 {1..10}?
file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.
그러면 다음 명령이 맞나요?
for file in $(ls);
do
mv $file file.$(date +%Y%m).$$.{1..10}
done
답변1
중괄호를 확장하면 {1..10}
명령줄이 여러 인수를 포함하도록 확장됩니다.
예를 들어 touch
명령줄은 다음과 같이 확장됩니다.
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
처형되기 전에. touch
유틸리티는 명령줄에서 임의 개수의 인수를 허용하므로 괜찮습니다 . 참고: 이렇게 하면 1개의 파일이 아닌 10개의 파일이 생성됩니다.
그러나 이 mv
유틸리티는 touch
. 하나 이상의 소스 파일/디렉터리와 끝에 대상 파일/디렉터리가 있어야 합니다.
이는 다음을 의미합니다.
mv $file $file.$(date +%Y%m).$$.{1..10}
다음과 같이 확장하십시오.
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
이사하고 싶다고 가정 해 봅시다모두파일(명령줄의 마지막 내용 제외) 또한 명령줄의 마지막 항목은 디렉터리 이름이 될 것으로 예상합니다(여러 항목을 이동하므로).
해당 루프에서 실제로 수행하려는 작업이 무엇인지 명확하지 않으므로 이 문제를 해결하는 방법에 대해 더 이상 언급할 수 없습니다.
루프 자체에 관해서는,제발그러한 출력을 절대 사용하지 마십시오 ls
. 대신에
for file in ./*; do
# process "$file"
done
출력은 ls
다음과 같습니다.보고 있다, 여러 가지 이유로 스크립팅 사용에 적합하지 않습니다. 바라보다http://unix.stackexchange.com/questions/128985/why-not-parse-ls
또한 항상 큰따옴표로 변수를 인용하십시오. 바라보다http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells