다음과 같은 디렉터리 이름이 있습니다.
/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
보충 설명:
- 물론 한줄로 작성하는 것도 가능합니다.
for dir in */; do composer show drupal/"$dir" --available | ack versions; done
- 다음과 같이 명시적인 디렉터리 이름 목록을 반복하도록 명령을 조정할 수 있습니다.
실제 디렉터리 이름에 특수 문자가 포함되어 있는 경우 개별 목록 항목을 따옴표로 묶어야 합니다(그러나 따옴표만으로는 충분하지 않은 상황이 있으므로 위에 표시된 전역 기반 접근 방식이 여전히 가장 안전합니다).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
의 경우 N
glob이 어떤 파일과도 일치하지 않는 경우 오류가 발생하지 않도록 /
파일 형식을 선택하세요 .목차오직. 숨겨진 디렉터리도 포함하려면 D
( D
otglob의 경우) 한정자를 추가하세요.
디렉터리에 대한 심볼릭 링크도 포함하여 교체합니다(확장자가 각 파일 끝에 추가된다는 점을 /
제외 하면 다른 셸에서도 작동함 ) .-/
*/
*/
/
여기서는 각 명령에 대해 하나씩 실행할 필요가 없으므로 ack
모든 명령의 출력에 대해 한 번만 실행합니다 . composer
이는 또한 파이프라인의 전체 종료 상태가 version
파이프라인 중 하나 이상에서 발견되었는지 여부를 반영한다는 것을 의미합니다. | ack version
루프 내부로 이동하면 전체 종료 상태 version
는 처리된 마지막 디렉터리에서 발견되었는지 여부를 반영하므로 이는 쓸모가 없습니다.