내가 디렉토리를 정리하고 있다고 가정해 봅시다. 다음과 같습니다.
.
├── 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