하나를 제외한 모든 파일을 어떻게 이동합니까? 나는 다음과 같은 것을 찾고있다 :
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
여기서 오래된 물건을 새 물건 폴더로 옮깁니다 Tux.png
. ! -sign은 부정을 나타냅니다. 작업을위한 도구가 있습니까?
하나를 제외한 모든 파일을 어떻게 이동합니까? 나는 다음과 같은 것을 찾고있다 :
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
여기서 오래된 물건을 새 물건 폴더로 옮깁니다 Tux.png
. ! -sign은 부정을 나타냅니다. 작업을위한 도구가 있습니까?
답변:
bash를 사용하고 extglob
쉘 옵션을 설정 한 경우 (보통)
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
.bashrc에 다음을 넣으십시오.
shopt -s extglob
정규식을 확장합니다. 그런 다음 하나를 제외한 모든 파일을
mv !(fileOne) ~/path/newFolder
디렉토리를 복사 할 때 스레드에서 알 수 있듯이 이름에 순방향 플래시를 사용할 수 없습니다. 조건을 제외하고 왜 extglob을 제외해야합니까? :
cp -r !(Backups.backupdb) /home/masi/Documents/
Backups.backupdb/
부정하기 전에 여기가 잘못 되었으므로 잘못 사용하면 다른 명령과 다른 예외가 발생할 수 있으므로 디렉토리를 이동하는 데 사용하지 않습니다.
mv !(arc*) archive_190629b
나는 전통적인 find & xargs 방식으로 갈 것입니다 :
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 |
xargs -0 mv -t ~/Linux/New
-maxdepth 1
재귀 적으로 검색하지 않습니다. 파일 만 신경 쓰면 말할 수 있습니다 -type f
. 경로 자체를 결과에 -mindepth 1
포함시키지 않습니다 ~/Linux/Old
. 포함 된 줄 바꿈이 포함 된 파일 이름을 포함하여 모든 파일 이름에서 작동합니다.
한 의견에 따르면 mv -t
옵션은 아마도 GNU 확장 일 것입니다. 없는 시스템
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
-exec mv '{}' ~/Linux/New \;
빠른 명령은 이동 명령이 일치하지 않도록 tux 파일 이름을 수정하는 것입니다.
예를 들면 다음과 같습니다.
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
가장 쉬운 방법은 백틱을 사용하는 것입니다.
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
편집하다:
별명으로 백 슬래시를 사용하지 말고, 대신 ls는 ls --color로 별명을 지정하십시오.
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
감사합니다 @Arnold Roa
grep -v
시겠습니까?
나는 이것이 특정 파일이나 디렉토리를 제외하는 간단한 이동에 조금 더 안전하고 쉽게 의존한다는 것을 알았습니다.
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
-l
에 옵션은 ls
명령 행에서 관련없는 정보를 많이 포함 MV 명령의 고장의 원인이됩니다.
다음은 100 % 보장 된 방법이 아니며 스크립팅을 시도해서는 안됩니다. 그러나 때로는 대화식 쉘을 빠르게 사용하기에 충분합니다. 같은 파일 파일 glob
[abc]*
(a, b 또는 c로 시작하는 이름을 가진 모든 파일과 일치)는 "^"문자를 먼저 삽입하여 무시할 수 있습니다.
[^abc]*
예를 들어 다음과 같이 "lost + found"디렉토리와 일치하지 않기 위해 이것을 사용합니다.
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
물론 l로 시작하는 다른 파일이 있으면 나중에 처리해야합니다.
다음 과 같이 grep 을 건너 뛸 수 있습니다 .
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/