디렉터리가 아닌 파일만 이동하는 방법

디렉터리가 아닌 파일만 이동하는 방법

내가 디렉토리를 정리하고 있다고 가정해 봅시다. 다음과 같습니다.

.
├── file_a.adoc
├── file_a.c
├── file_a.py
├── file_b.adoc
├── file_b.c
├── file_b.py
├── file_c.adoc
├── file_c.c
└── file_c.py

이제 나는 이 시점에 있다:

.
├── a
│   ├── file_a.adoc
│   ├── file_a.c
│   └── file_a.py
├── b
│   ├── file_b.adoc
│   ├── file_b.c
│   └── file_b.py
├── c
├── file_c.adoc
├── file_c.c
└── file_c.py

디렉터리가 아닌 나머지 파일을 모두 dir c로 이동하는 명령이 필요합니다.

이 예에서는 다음을 사용할 수 있습니다.

mv *_c* c

그러나 보다 현실적인 시나리오에서는 파악하기에 좋은 패턴이 없거나 패턴 식별에 관심이 없을 수도 있습니다.

답변1

한 가지 접근 방식은 "파일의 모든 내용을 c로 이동"을 문자 그대로 번역하는 것입니다.

for f in *; do if [ -f "$f" ]; then mv "$f" c; fi; done

또는 if-then의 장황함을 피하십시오.

for f in *; do [ -f "$f" ] && mv "$f" c; done

더 나은 점은 set -e셸에서 실패하지 않는다는 것입니다.

for f in *; do [ -f "$f" ] && mv "$f" c || true; done

나는 작업 중 하나가 실패하는 경우에만 실패하는 것을 선호합니다.

for f in *; do [ ! -f "$f" ] || mv "$f" c; done

말 그대로: 모든 f에 대해 파일이 아니거나 c로 이동되거나 중단됩니다.

답변2

zsh쉘 사용 :

mv -- *(.) c

이는 와일드카드 패턴을 확장 *하지만 와일드카드 한정자 (.)는 일반 파일의 이름만 포함하도록 필터링합니다. 그런 다음 명령을 내리고 mv모두 c디렉토리로 이동하십시오.

쉘이 아닌 경우 zsh:

zsh -c 'mv -- *(.) c'

(.)일반 파일의 이름만 선택하기 위해 와일드카드를 사용하는 대신 문자 그대로 "비디렉토리"를 의미하는 이름을 사용할 수 있습니다. (^/)차이점은 *(^/)기호 링크 및 기타 비디렉토리 파일 유형의 이름과도 일치할 수 있다는 것입니다.

답변3

for i in a b c; do
  mkdir "$i" # use -p if you need it
  find . -type f -name "*_$i.*" -exec mv -t "$i" {} + # or, mv {} "$i" \;
done

관련 정보