
나는 의심이 든다. 시퀀스 번호 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
유틸리티는 명령줄에서 여러 인수를 사용하므로 괜찮습니다 . 참고: 이렇게 하면 하나의 파일이 아닌 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