**파일 이름에 공백이 있는 파일의 경우:

**파일 이름에 공백이 있는 파일의 경우:

디렉토리에 있는 여러 c 소스 파일을 복사하고 이름을 바꾸고 싶습니다.

다음과 같이 복사할 수 있습니다.

$ cp *.c $OTHERDIR

하지만 모든 파일 이름에 접두사를 붙이고 싶습니다.

file.c --> old#file.c

이 작업을 한 단계로 어떻게 수행할 수 있나요?

답변1

루프 for:

for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done

나는 종종 진행 상황을 관찰할 수 있는 -v옵션을 추가합니다.cp

답변2

쉘 와일드카드를 사용할 수 있습니다.

for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done

형식 for variable in GLOB이 확장됩니다.전반적인 상황일치하는 모든 파일/디렉터리(숨겨진 파일 제외)에 대해 반복하고 각 파일/디렉터리를 차례로 저장합니다 $variable(위 예에서는 $f). 따라서 제가 표시하는 명령은 숨겨지지 않은 모든 파일을 반복하여 복사하고 접두사를 추가합니다.

답변3

xargs이는 tr, 및 globbing을 사용하는 단일 라이너입니다. 어느 정도 가치가 있을 수 있습니다.

echo *.c | tr ' ' '\n' | xargs -n1 -I{} cp "{}" "PREFIX{}"

*.c그러면 일치하는 모든 파일이 공백으로 구분된 문자열로 반환됩니다 . 다음으로, tr추가 공백을 개행 문자(알아채다공백이 포함된 파일 이름은 테스트되지 않습니다 **). 그런 다음 xargs각 파일 이름을 채우고 cp적절한 이름과 접두사를 사용하여 실행합니다.

*.c다른 유용한 글로브로 수정될 수 있습니다. xargs및 섹션의 다른 접두사 cp도 사용할 수 있습니다.

**파일 이름에 공백이 있는 파일의 경우:

( find지원 필요 -print0) 위와 비슷하게 find출력 에 사용할 수 있습니다.유효하지 않은- 구분된 파일 목록 및 xargs구분 플래그로 조정됨유효하지 않은

find . -name '*.c' -print0 | xargs -0 -n1 -I{} cp "{}" "PREFIX{}"

답변4

필요한 경우 이는 재귀적 접근 방식입니다.

for f in `find . -name \*.c`; do name="${f//\.\//__}"; fileName="${name//\//_}" ; echo "Copying $f as $OTHERDIR/old#$fileName"; cp -- "$f" "$OTHERDIR/$fileName"; done

관련 정보