bash 명령에 디렉터리 이름만 전달

bash 명령에 디렉터리 이름만 전달

다음과 같은 디렉터리 이름이 있습니다.

/aaa
/bbb
/ccc
/ddd

디렉터리 이름을 전달하여 다음 명령을 실행하고 싶습니다.엘에스:

ls | composer show drupal/MY_DIRECTORY_NAME_HERE --available | ack versions

이 Composer 명령에 전달된 디렉터리 이름을 반복하는 한 줄 명령을 어떻게 만들 수 있습니까?

답변1

명령이 기존의 모든 하위 디렉터리에 적용되기를 원하기 때문에 가장 깔끔한 방법(특수 문자가 포함된 디렉터리 이름 문제를 피하는 방법)은 다음과 같습니다.

for dir in */
do
   composer show drupal/"$dir" --available | ack versions
done

이는 숨겨지지 않은 모든 디렉터리와 디렉터리에 대한 심볼릭 링크( /후행 glob 패턴으로 인해)를 반복하고 현재 디렉터리에서 명령을 실행합니다.

이는 명령이 후행 경로가 있는 디렉토리 경로를 허용한다고 가정한다는 점에 유의하십시오 /. 그렇지 않은 경우 일부 쉘 문자열 조작을 수행하여 제거하면 /도움이 될 수 있습니다.

for dir in */
do
   composer show drupal/"${dir%/}" --available | ack versions
done

보충 설명:

  1. 물론 한줄로 작성하는 것도 가능합니다.
    for dir in */; do composer show drupal/"$dir" --available | ack versions; done
    
  2. 다음과 같이 명시적인 디렉터리 이름 목록을 반복하도록 명령을 조정할 수 있습니다.
    for dir in '/aaa' '/bbb' '/ccc'
    do
        ...
    done
    
    실제 디렉터리 이름에 특수 문자가 포함되어 있는 경우 개별 목록 항목을 따옴표로 묶어야 합니다(그러나 따옴표만으로는 충분하지 않은 상황이 있으므로 위에 표시된 전역 기반 접근 방식이 여전히 가장 안전합니다).

답변2

나는 무엇을 할 것인가:

printf '%s\n' '/aaa' '/bbb' '/ccc' |
    xargs -I{} composer show drupal/{} --available |
    ack versions

또는 현재 디렉터리 내의 모든 디렉터리에 대해 다음을 수행합니다.

find . -type d -mindepth 1 -maxdepth 1 -print0 |
    xargs -0 -I{} composer show drupal/{} --available |
    ack versions

답변3

그리고 zsh:

for dir in *(N/); do composer show drupal/$dir --available; done | ack version

(N/)부분은글로벌 예선, ulglob N의 경우 Nglob이 어떤 파일과도 일치하지 않는 경우 오류가 발생하지 않도록 /파일 형식을 선택하세요 .목차오직. 숨겨진 디렉터리도 포함하려면 D( Dotglob의 경우) 한정자를 추가하세요.

디렉터리에 대한 심볼릭 링크도 포함하여 교체합니다(확장자가 각 파일 끝에 추가된다는 점을 /제외 하면 다른 셸에서도 작동함 ) .-/*/*//

여기서는 각 명령에 대해 하나씩 실행할 필요가 없으므로 ack모든 명령의 출력에 대해 한 번만 실행합니다 . composer이는 또한 파이프라인의 전체 종료 상태가 version파이프라인 중 하나 이상에서 발견되었는지 여부를 반영한다는 것을 의미합니다. | ack version루프 내부로 이동하면 전체 종료 상태 version는 처리된 마지막 디렉터리에서 발견되었는지 여부를 반영하므로 이는 쓸모가 없습니다.

관련 정보