디렉토리에 있는 여러 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