xargs repl_str은 두 번째 자리 표시자를 확장하지 않습니다.

xargs repl_str은 두 번째 자리 표시자를 확장하지 않습니다.

일부 파일의 이름을 바꾸고 다른 파일을 디렉토리에서 제외하고 싶습니다. 나는 노력했다

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -print0 |
xargs -0 -I {} sudo mv -- {} $(echo {} | sed 's/local.conf/local.example.com.conf/')

그러나 이것은 작동하지 않습니다.

mv명령의 두 번째 매개변수가 올바르게 확장되지 않은 것 같습니다 .

답변1

$(...)쉘은 xargs를 호출하기 전에 이 섹션을 평가합니다. 시도해 볼 수 있는 작업은 다음과 같습니다.

xargs -0 -I {} bash -c 'mv {} $(echo {} | sed "s/local.conf/local.example.com.conf/")'

sed를 피할 수 있습니다

xargs -0 -I {} bash -c 'f="{}"; mv "{}" "${f/local.conf/local.example.com.conf}"'

사용 가능한 경우 명령 도 참조하세요 rename.

답변2

xargs그것 없이도 비슷한 것을 쓸 수 있습니다

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -exec sh -c '
sudo mv -- "$0" "$(echo "$0" | sed "s/local.conf/local.example.com.conf/")"

'{} \;

바라보다"find ... -exec sh -c '...' sh {} +"를 사용한 find 명령은 어떻게 작동합니까?자세한 내용은.

관련 정보