이 패턴과 일치하는 하위 디렉터리에서 파일을 복사하려고 합니다.
vendor/plugin/*/tasks/*.rake
폴더에 넣어
lib/tasks
답변1
간단하게 들리네요:
cp vendor/plugin/*/tasks/*.rake lib/tasks
또는 첫 번째 항목이 *
전체 하위 트리와 일치해야 하는 경우 다음과 같은 방법을 사용하세요.
find vendor/plugin -path "*/tasks/*.rake" -exec cp "{}" lib/tasks +
답변2
파일을 덮어쓰는 대신 이름 충돌에 대한 알림을 받아 이름 충돌(예: vendor/plugin/a/tasks/1.rake
및 사이의 충돌) 을 처리하려는 경우 셸 루프를 사용합니다.vendor/plugin/b/tasks/1.rake
destdir=lib/tasks
for pathname in vendor/plugin/*/tasks/*.rake
do
destpath=$destdir/${pathname##*/}
if [ -e "$destpath" ]; then
printf 'Can not move "%s", "%s" is in the way' \
"$pathname" "$destpath" >&2
continue
fi
cp "$pathname" "$destpath"
done
선
destpath=$destdir/${pathname##*/}
다음과 같이 쓸 수도 있습니다.
destpath=$destdir/$(basename "$pathname")
대상의 경로 이름을 구성하여 이미 사용되었는지 확인하세요.
당신은 또한 이것을 할 수 있습니다
cp -i vendor/plugin/*/tasks/*.rake lib/tasks
유틸리티 자체에서 각 이름 충돌에 대한 대화형 프롬프트를 얻습니다 cp
. 이 명령은 vendor/plugin/*/tasks/*.rake
명령줄에서 패턴 확장에 의존하며 확장된 경로 이름 수에 따라 "인수 목록이 너무 깁니다" 오류가 발생할 수 있습니다. 이 경우 루프를 대신 사용할 수 있습니다.
for pathname in vendor/plugin/*/tasks/*.rake
do
cp -i "$pathname" lib/tasks
done
이 루프는 이 답변의 초기 루프와 거의 동일합니다. 유일한 차이점은 cp
이름 충돌이 발생할 때 유틸리티가 사용자에게 메시지를 표시한다는 것입니다.
위의 모든 변형은 패턴이 vendor/plugin/*/tasks/*.rake
실제로 무엇인가와 일치하고 대상 디렉터리가 lib/tasks
이미 존재한다고 가정합니다. 나는 또한 당신이 숨겨진 이름을 가진 하위 디렉토리나 파일에는 관심이 없다고 가정합니다.