하위 폴더의 모든 파일 (숨김 포함)을 재귀 적으로 * nix의 상위 폴더로 옮기는 방법은 무엇입니까?


14

이것은 약간 난처한 질문이지만, 경력이 늦어도 mv 명령에 대한 질문이 있음을 인정해야합니다.

이 문제가 자주 발생합니다. 모든 파일을 재귀 적으로 한 수준 위로 이동해야합니다. 폴더 foo와 그 안에 폴더 표시 줄이 있다고 가정 해 봅시다. 막대에는 도트 파일 및 폴더를 포함하여 파일 및 폴더가 엉망입니다. 모든 것을 foo 레벨로 옮기려면 어떻게해야합니까?

foo가 비어 있으면 단순히 막대를 한 수준 위로 이동하고 foo를 삭제하고 bar의 이름을 foo로 바꿉니다. 문제의 일부는 "도트를 포함한 모든 것"에 대한 mv의 와일드 카드가 무엇인지 알 수 없다는 것입니다. 이 질문의 일부는 이것입니다-cp 및 mv 명령이 어딘가에서 사용하는 와일드 카드에 대한 심층 토론이 있습니까?

답변:


19

Bash (및 다른 것)에서는 중괄호 확장을 사용하여 한 줄 로이 작업을 수행 할 수 있습니다.

mv bar/{,.}* .

너무 쉼표는 널 (null)과 점을 분리 mv명령은 파일 이름을보고 그 일치 *.*


이것은 '..'도 이동하려고 시도하고 '자원이 사용 중입니다'라는 메시지와 함께 실패합니다. 그럼에도 불구하고 작동합니다.
Xananax

3
익명의 사용자에 의해 제안 :To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

가장 쉬운 방법은 *가 일치하지 않기 때문에 두 명령으로 수행하는 것입니다.

cd /foo
mv bar/* ./
mv bar/.??* ./

이 실수를 저지르는 동안 내가 찾은 bar /.*를 사용하고 싶지 않습니다.

rm -rf ./.* 

이것은 나쁜 것입니다. 누구나 왜 그런지 추측하고 싶어? ;-)


Bash 또는 Zsh .*.and로 확장되지 않는다고 생각 ..합니다. Zsh는 적어도 나를 위해하지 않습니다.
Mikael S

Mikael : bash가 그렇게함으로써 삭제 한 사용자 디렉토리를 복구해야했기 때문에 bash가 (또는 적어도 그렇게했다) 약속 할 수있다
Matt Simmons

2

globbing에 대해 알아야 할 첫 번째 사항은 명령이 아니라 쉘에 의해 수행됩니다. 자세한 내용은 쉘 매뉴얼 페이지를 확인하십시오.


2

이것은 하위 폴더에서 모든 파일을 수집하여 현재 디렉토리로 옮깁니다.

find . -type f -exec mv -iv \{} . \;

동일한 이름의 파일을 작성하려면 다음을 사용하십시오.

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *점 다음에 단일 문자를 제외한 모든 것을 처리합니다. 해당 상황에 공통 인 경우을 추가 할 수 있습니다 .[a-zA-Z0-9]*. 즉 여전히 같은 이름을 가진 파일을 떠나 .;, .^그리고 .^I(탭). 모든 것을 처리해야한다면 좀 더 복잡해야합니다.

mv .. `ls -f | egrep -v '^.$|^..$'

0

디렉토리 구조가 /foo/bar/있고 bar위의 한 단계 아래에서 모든 파일을 이동 하려면 bar디렉토리 로 이동 하여 다음을 입력하십시오.

find . -depth -print0 | cpio --null -pvd ../

일반적으로 cpio(1)이런 종류의 작업에는 더 좋습니다. info cpio쉘에서 발행하여 자세한 문서를 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.