여러 하위 디렉터리에서 동일한 명령 세트를 번호 순서대로 실행하는 방법은 무엇입니까?

여러 하위 디렉터리에서 동일한 명령 세트를 번호 순서대로 실행하는 방법은 무엇입니까?

내 parent_directory에는 E-11_G 및 E-10_G라는 하위 디렉터리가 있습니다. 각 하위 디렉터리에는 E-2_U, E-1_U 및 E0_U라는 하위 디렉터리가 더 있습니다. 각 폴더에서 ander, ander.band, ander.data, ander.in 및 ander.log 파일에 대해 명령을 실행합니다.

더 나은 그림은 다음과 같습니다.

                               parent_directory
                               E-11_G/ E-10_G/ 
                          E-2_U/ E-1_U/ E0_U/ 
            ander  ander.band  ander.data  ander.in  ander.log

보다 효율적인 버전을 작성하고 싶습니다.

#!/bin/bash

cd parent_directory/E-11_G/E-2_U/; 
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E-1_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E0_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../../E-10_G/E-2_U/;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E-1_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;
cd ../E0_U;
ls -l ander ander.band ander.data;
cat ander.in;
cat ander.log;
pwd;

나는 이 스크립트를 있는 그대로 성공적으로 실행할 수 있었지만 실제로는 내가 제공한 것보다 더 많은 디렉터리를 사용하고 있기 때문에 더 간단하고 효율적인 작성 방법이 필요합니다. 내가 이렇게 하는 이유는 각 하위 디렉터리에 대해 각 "ander" 파일의 특정 기록을 유지해야 하기 때문입니다. 기본적으로 이 스크립트를 실행하고 쉘 > 텍스트를 텍스트 파일로 내보내기를 사용하여 터미널 창에 표시된 모든 것을 텍스트 파일로 내보낼 계획입니다. 그렇기 때문에 각 디렉토리의 레코드를 번호순으로 정렬하고 싶습니다.

어떻게 하면 스크립트를 더 효율적으로 만들 수 있나요? 이것이 내 목표입니다.

#!/bin/bash

cd parent_directory/;

do i= -11, -10 
   do j= -2, 0
      cd  E-i_G/E-j_U/;
      ls -l ander ander.band ander.data;
      cat ander.in;
      cat ander.log;
      pwd;
   end
end

나는 이것이 Fortran으로 거의 작성되었다는 것을 알고 있지만 bash 스크립트에 이것과 동등하거나 유사한 것이 있습니까? 나는 "for 루프"를 사용하려고 시도했지만 첫 번째 스크립트와 동일한 결과를 제공하는 방식으로 작성할 수 없는 것 같습니다.

답변1

cd parent_directory/

for i in {-11..-10}
do
   for j in -2 0
   do
      (
      cd  "E${i}_G/E${j}_U/"
      ls -l ander ander.band ander.data
      cat ander.in
      cat ander.log
      pwd
      )
   done
done

노트:

  • 중괄호 표기법을 사용하여 숫자 범위를 반복할 수 있습니다.

    for i in {-11..-10}
    
  • 명시적인 항목 목록을 반복할 수도 있습니다.

    for j in -2 0
    
  • 일부 위치가 변수에 따라 달라지도록 디렉토리를 변경할 수 있습니다.

    cd  "E${i}_G/E${j}_U/"
    
  • 이 명령에 대한 인수는 cd현재 디렉터리를 기준으로 디렉터리를 지정합니다. 해당 디렉토리에서 작업을 마친 후 다시 parent_directory로 변경하려고 합니다. 이를 처리하는 방법은 여러 가지가 있지만 간단한 방법은 cd명령과 해당 디렉터리에서 실행될 명령을 괄호로 표시되는 하위 쉘에 넣는 것입니다. 대괄호를 종료하면 디렉터리가 자동으로 이전 상태로 복원됩니다.

답변2

보다 일반적인 솔루션으로 를 사용할 수 있습니다 xargs. 이 방법으로 작업할 디렉터리 목록에서 작업을 분리할 수 있습니다.

필요한 작업을 수행하는 스크립트를 작성하여 시작하십시오.

Execute_ander.sh

#!/bin/bash

# Exit immediately on error
set -e

if [[ $# -ne 1 ]] ; then
  echo "USAGE: $0 DIRECTORY" >&2
  exit 1
fi

cd "$1"

ls -l ander ander.band ander.data
cat ander.in
cat ander.log
pwd

스크립트를 실행 가능으로 표시합니다.

chmod +x perform_ander.sh

마지막으로 실행:

find -type d -name 'E*_U' | xargs -n1 ./perform_ander.sh

설명하다

찾다

find명령은 일치하는 모든 파일을 stdout으로 출력합니다.

-type d디렉토리로 검색 제한

-name 'E*_U'glob과 일치하는 디렉터리로 검색을 제한합니다.

매개변수

명령 은 xargs표준 입력을 인수 소스로 사용하고 해당 인수를 사용하여 지정된 명령을 호출합니다.

-n1한 번에 1개 이하의 매개변수가 전달되도록 지정합니다.

관련 정보