파일과 하위 디렉터리가 포함된 디렉터리를 정리하려고 합니다. 내가 원하는 것은 간단합니다. 모든 파일을 다른 디렉터리로 이동하되 모든 하위 디렉터리는 변경하지 않고 그대로 두는 것입니다.
나는 다음과 같은 것을 생각하고 있습니다 :
mv [*_but_no_dirs] ./other_directory
*
와일드카드와 정규식을 사용하여 이 작업을 수행 하는 쉬운 방법이 있어야 할 것 같습니다 ...
누구든지 어떤 아이디어가 있습니까?
답변1
여기에는 정규 표현식이 포함되지 않습니다. Bash의 와일드카드(대부분의 다른 쉘과 마찬가지로)는 유형이나 기타 특성이 아닌 이름만을 기준으로 파일을 일치시킵니다. 유형별로 일치시키는 방법이 있습니다. /
디렉토리나 디렉토리만 일치하도록 패턴 끝에 심볼릭 링크를 추가하는 것입니다. 이 방법을 사용하면 디렉토리를 이동한 다음 나머지 디렉토리를 이동한 다음 다시 디렉토리를 이동할 수 있습니다. 번거롭지만 효과적입니다.
tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * other_directory/
mv "$tmp"/* .
rmdir "$tmp"
(현재 디렉토리가 파일 시스템의 마운트 지점인 경우에는 이 접근 방식을 피해야 합니다. 이는 디렉토리를 밖으로 이동하거나 뒤로 이동하면 그 안의 모든 데이터를 두 번 복사해야 함을 의미하기 때문입니다.)
유형별로 파일을 일치시키는 표준 방법은 다음을 호출하는 것입니다.find
.
find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +
(심볼릭 링크도 디렉토리를 가리키는지 여부에 관계없이 이동됩니다.)
zsh에서는 사용할 수 있습니다글로벌 예선유형별로 파일을 일치시킵니다. 한정자는 디렉터리가 아닌 모든 항목을 일치시키거나 디렉터리에 대한 기호 링크를 제외하는 데 .
사용되는 일반 파일과 일치합니다 .^/
-^/
mv -- *(.) other_directory/
어떤 쉘에서든 간단하게 반복할 수 있습니다.
for x in *; do
if [ ! -d "$x" ]; then
mv -- "$x" other_directory/
fi
done
(심볼릭 링크는 디렉토리로 이동되지 않습니다).
답변2
당신은 다음과 같은 것을 사용할 수 있습니다
find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv "$@" MYDIR' _ {} \;
먼저 find
현재 디렉터리만 살펴본 다음 ! -type d
finally를 사용하여 디렉터리를 무시하고 sh
모든 것을 실행하고 대상 디렉터리로 이동합니다. {} +
마지막에 시도해 보면 더 빨라질 것입니다 .
답변3
조금 위험할 수도 있지만
cp * destination/
rm *
-r 스위치 없이는 cp나 rm을 디렉토리에서 실행할 수 없기 때문입니다.
답변4
mv $(find /my/source/directory -maxdepth 1 -type f) /my/destination/directory
find
Move는 인수 목록을 사용하므로 피드에서 '파일' 유형의 모든 콘텐츠를 요청하면 /my/source/directory
하나씩 이동합니다 /my/destination/directory
. 디렉터리 구조를 변경하지 않고 하위 디렉터리에도 파일을 포함하려면 -maxdepth 1
위 명령에서 해당 파일을 제거하세요.