다른 디렉토리를 기반으로 mkdir 입력

다른 디렉토리를 기반으로 mkdir 입력

FLAC 형식으로 추출한 앨범으로 가득 찬 카탈로그가 있습니다. "아티스트 - 앨범 [flac]"이라는 폴더 이름이 "아티스트 - 앨범 [mp3]"인 일치하는 디렉터리를 만들어야 하는데 특정 폴더에만 해당됩니다...

그래서 "ls | grep Pantera"는 내가 사용하고 싶은 디렉토리 목록을 제공합니다...

명령줄을 통해 이 작업을 어떻게 수행할 수 있나요?

답변1

xargs를 사용하면 한 명령의 출력을 다른 명령을 실행하기 위한 인수로 사용할 수 있지만 ls공백 및 인용 문제로 인해 출력을 사용하는 것은 매우 문제가 됩니다. 제안을 완료하려면 생성된 이름에 공백이 있는 경우 다음을 수행해야 합니다.

ls | grep Pantera | sed -e 's/\[flac\]/[mp3]/' | xargs -n1 -i{} mkdir "{}"

하지만훨씬 낫다이를 위해 도구에는 find명령과 -exec옵션이 사용됩니다. 변수 대신 리터럴 문자열에서 bash의 문자열 함수를 사용하는 방법이나 하나의 명령에서 변수를 설정하고 사용하는 방법을 아는 사람이 아니면 다음이 필요합니다.ssapkota의 구문프로모터 쉘.

-type dfind를 사용할 때 디렉터리 일치(또는 -type f파일) 만 반환하는 등 고려해야 할 옵션도 있습니다 . -maxdepth 1재귀 조회를 수행하려는 경우 이를 제거할 수 있습니다. 패턴 일치는 시나리오에 맞게 개선될 수도 있습니다.

답변2

찾기가 최고의 도구입니다. 그러나 find단일 명령만 허용되며 연결은 지원되지 않습니다.

다음은 일치하는 각 디렉터리 이름에 대해 하위 쉘을 분기하여 작동하는 솔루션입니다.

find -maxdepth 1 -iname "*Pantera*" -exec  \
    bash -c ' name="{}" && mkdir "${name/flac/mp3}" ' \;

답변3

모든 파일이 같은 디렉토리에 있습니까? 그런 다음 간단한 루프와 셸 문자열 조작 구성을 사용할 수 있습니다.

for flac_dir in *Pantera*'[flac]'/; do
  flac_dir=${flac_dir%/}
  mp3_dir="${x%\[flac\]}[mp3]"
  mkdir "$mp3_dir"
done

하위 디렉터리, zsh 또는 bash ≥4에서 반복적으로 작업하려면 for flac_dir in **/*Pantera*'[flac]'/bash를 사용하여 shopt -s globstar먼저 실행해야 합니다.

관련 정보