시작 부분에 "@"이 포함된 모든 줄이 필요한 별도의 목록이 많이 있습니다. 현재 파일을 처리하는 데 사용하고 있습니다 sh list_of_commands
. 이 작업을 수행하는 더 현명한 방법이 있는지 궁금합니다.
1) 모든 명령줄을 하나씩 작성하지 않고 모든 파일을 일괄 처리하는 방법은 무엇입니까?
2) 입력 파일 이름에 접미사를 추가하여 출력 파일 이름을 지정하는 방법이 있습니까?
매우 감사합니다!
답변1
다음 스크립트는 스크립트가 실행되는 디렉터리의 모든 파일을 크롤링하고 해당 파일에 하나씩 명령을 적용합니다. 그게 당신이 원하는 것인가요?
#! /bin/sh
for file in *
do
if [[ -f "$file" ]]; then
# process the file with name in "$file" here
fi
done
위 루프에서 다음 문을 사용하여 요청 시 파일 이름 바꾸기를 수행할 수 있습니다.
mv "$file" "$(echo" $file" | sed -n "s|^\(.*\)\(\.[0-9a-zA-Z]*\)$|\1_su\2|p")"
파일 확장자 접미사 앞, 파일 이름 끝에 접미사 "_su"를 배치합니다. 파일에 확장자가 없으면 파일 이름 끝에 접미사가 붙습니다.
답변2
- 스크립트에서 명령 수집(아래 참조)
- 스크립트 명령줄에 제공된 파일 이름에 접미사를 추가하고 이를 출력 파일 이름으로 사용합니다.
#!/bin/sh
for name in "$@"; do
some_utility "$name" >"$name.suffix"
done
"$@"
명령줄에서 참조되는 내용 목록으로 확장됩니다. 예를 들어,
$ ./script.sh a b "hello world" 123
이 변수는 루프의 연속 반복에서 , 및 $name
값을 사용 합니다 . 이 방법으로 입력 파일을 전달할 수 있습니다.a
b
hello world
123
$ ./script.sh input*.txt
그러면 주어진 패턴과 일치하는 현재 디렉터리의 모든 파일이 제공됩니다.
그런 다음 이 변수를 $name
각 입력 파일의 이름으로 사용할 수 있으며 값 끝에 간단히 태그를 지정하여 접미사를 추가할 수 있습니다(예: 출력 파일의 이름으로 사용).
루프 내부의 행을 실제로 파일을 처리하는 행으로 바꾸십시오 $name
.
이 작업을 수행하는 ./script.sh
데 사용하는 chmod +x script.sh
.