'ls'를 반복하면 bash 쉘 스크립트가 생성됩니다.

'ls'를 반복하면 bash 쉘 스크립트가 생성됩니다.

ls디렉토리 이름 목록에 대한 작업을 수행하고 각 디렉토리를 반복하여 작업을 수행하기 위한 템플릿 쉘 스크립트가 있는 사람이 있습니까 ?

ls -1d */디렉토리 이름 목록을 가져오려고 합니다 .

답변1

@shawn-j-goff 및 다른 사람들이 제안한 것처럼 glob이 사용하는 곳에 ls를 사용하지 않도록 편집되었습니다.

루프 를 사용하세요 for..do..done.

for f in *; do
  echo "File -> $f"
done

를 목록(파일, 디렉터리 또는 해당 문제의 모든 항목)을 반환하는 다른 glob, 목록을 생성하는 명령(예: ) *으로 바꾸 거나 실제로 목록으로 바꿀 수 있습니다.*.txt$(cat filelist.txt)

루프 내에서는 do달러 기호 접두사가 있는 루프 변수를 참조하기만 하면 됩니다( $f위의 예에서도 마찬가지). 당신은 echo그것을 할 수도 있고 당신이 원하는 대로 무엇이든 할 수 있습니다.

.xml예를 들어, 현재 디렉터리의 모든 파일 이름을 다음으로 바꾸려면 다음과 같이 하십시오 .txt.

for x in *.xml; do 
  t=$(echo $x | sed 's/\.xml$/.txt/'); 
  mv $x $t && echo "moved $x -> $t"
done

또는 Bash를 사용하는 경우 하위 쉘을 생성하는 대신 Bash 매개변수 확장을 사용할 수 있다는 것이 더 좋습니다.

for x in *.xml; do 
  t=${x%.xml}.txt
  mv $x $t && echo "moved $x -> $t"
done

답변2

파일 이름을 얻기 위해 의 출력을 사용하는 ls것은 나쁜 생각입니다.. 이로 인해 오작동하고 위험한 스크립트가 발생할 수도 있습니다. 이는 파일 이름에 /null문자를 제외한 모든 문자가 포함될 수 있고 ls해당 문자 중 어느 것도 구분 기호로 사용하지 않기 때문입니다. 따라서 파일 이름에 공백이나 개행 문자가 있으면~ 할 것이다예상치 못한 결과를 얻습니다.

파일을 반복하는 두 가지 좋은 방법이 있습니다. 여기서는 echo파일 이름을 사용하여 작업을 수행하는 방법을 간단하게 설명했습니다 . 하지만 무엇이든 사용할 수 있습니다.

첫 번째는 쉘의 기본 글로빙 기능을 사용하는 것입니다.

for dir in */; do
  echo "$dir"
done

쉘은 루프가 읽는 */별도의 인수로 확장됩니다. for파일 이름에 공백, 줄 바꿈 또는 기타 이상한 문자가 있더라도 for각 전체 이름은 원자 단위로 표시됩니다. 어떤 식으로든 목록을 분석하지 않습니다.

bash하위 디렉토리로 재귀적으로 이동하려는 경우 쉘에 일부 확장된 글로빙 기능(예: 's )이 없으면 이 작업은 수행되지 않습니다 globstar. 쉘에 이러한 기능이 없거나 스크립트가 작동하는지 확인하려는 경우 다양한 시스템에서 다음 옵션은 find.

find . -type d -exec echo '{}' \;

여기서 명령은 파일 이름의 인수를 find호출 하고 전달합니다. echo찾은 각 파일에 대해 이 작업을 한 번 수행합니다. 이전 예와 마찬가지로 파일 이름 목록을 구문 분석하지 않습니다. 대신 파일 이름이 완전히 인수로 전송됩니다.

인수 의 구문이 -exec조금 이상해 보입니다. find이후 첫 번째 인수를 가져와 -exec이를 실행할 프로그램으로 처리하고 모든 후속 인수를 해당 프로그램에 전달할 인수로 사용합니다. 확인해야 할 두 가지 특별한 인수가 있습니다 -exec. 첫 번째는 {}; 이 인수는 의 이전 부분에서 find생성된 파일 이름으로 대체됩니다. 두 번째는 프로그램에 전달할 인수 목록의 끝임을 알려주는 ;입니다 . exec'd 프로그램을 대상 으로 하거나 의도하지 않은 더 많은 인수를 계속 사용할 수 있기 때문에 이것이 필요합니다 . 그 이유는 쉘도 특별하게 처리하기 때문입니다 . 이는 명령의 끝을 나타내기 때문에 쉘이 자체적으로 소비하기보다는 인수로 제공하도록 이스케이프해야 합니다 . 쉘이 특별히 처리하지 않도록 하는 또 다른 방법은 따옴표로 묶는 것입니다. 이 목적 과 마찬가지로 잘 작동합니다 .findfindfind\;find';'\;

답변3

공백이 있는 파일의 경우 다음과 같이 변수를 인용해야 합니다.

 for i in $(ls); do echo "$i"; done; 

또는 IFS(입력 필드 구분 기호) 환경 변수를 변경할 수 있습니다.

 (IFS=$'\n';for i in $(ls); do echo $i; done) # subshell to restore IFS

마지막으로, 수행 중인 작업에 따라 ls가 필요하지 않을 수도 있습니다.

 for i in *; do echo "$i"; done;

답변4

CoverosGene의 답변에 추가하기 위해 디렉토리 이름만 나열하는 방법은 다음과 같습니다.

for f in */; do
  echo "Directory -> $f"
done

관련 정보