하나를 제외한 모든 파일 이동


155

하나를 제외한 모든 파일을 어떻게 이동합니까? 나는 다음과 같은 것을 찾고있다 :

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

여기서 오래된 물건을 새 물건 폴더로 옮깁니다 Tux.png. ! -sign은 부정을 나타냅니다. 작업을위한 도구가 있습니까?

답변:


142

bash를 사용하고 extglob쉘 옵션을 설정 한 경우 (보통)

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
mv ~ / Linux / Old /! (Tux.png Tux1.png Tux2.png) ~ / Linux / New / 전체 Old 디렉토리를 비 웁니다. 뭐가 잘못 되었 니?
Léo Léopold Hertz 준영

5
@UnixBasics, 시도 : ~ / Linux / Old /! (Tux.png | Tux1.png | Tux2.png)
Juliano

@ 줄리아노 매우 멋진 명령! OR 및 XOR과 같은 수학적 연산이 더 있습니까? 파이프가 AND 용이라고 가정합니다.
Léo Léopold Hertz 준영


@ 줄리아노 나는 오히려 mv ~ / Linux /? (Tux * .png) ~ / Linux / New / mv ~ / Linux / + (Tux * .png) ~ / Linux / New /와 같은 패턴으로 혼란스러워한다. 0-1 Tux -photo를 옮기고 싶었습니다. 후자에서는 1-n Tux 사진을 옮기고 싶었습니다. 그들은 모든 것을 움직였다. 왜? 특정 양의 사진을 이동할 수 있습니까?
Léo Léopold Hertz 준영

97

.bashrc에 다음을 넣으십시오.

shopt -s extglob

정규식을 확장합니다. 그런 다음 하나를 제외한 모든 파일을

mv !(fileOne) ~/path/newFolder

다른 명령과 관련된 예외

디렉토리를 복사 할 때 스레드에서 알 수 있듯이 이름에 순방향 플래시를 사용할 수 없습니다. 조건을 제외하고 왜 extglob을 제외해야합니까? :

cp -r !(Backups.backupdb) /home/masi/Documents/

Backups.backupdb/부정하기 전에 여기가 잘못 되었으므로 잘못 사용하면 다른 명령과 다른 예외가 발생할 수 있으므로 디렉토리를 이동하는 데 사용하지 않습니다.


3
이것은 실제로 정답입니다. 내 것이 잘못 펴졌다. 운 좋게도 파일이 거의없는 폴더에서 사용했습니다. Masi가 보여주는 방법에 대한 자세한 내용은 다음과 같습니다. wiki.bash-hackers.org/syntax/pattern "확장 패턴 언어"로 이동하면 이에 대한 자세한 정보를 찾을 수 있습니다. 문제를 지적 해 주신 @ paul-whittaker에게 감사드립니다.
mimoralea

이것은 오래된 답변이지만 여전히 유효합니다. 우분투 18을 사용하고 있으며 extglob은 기본적으로 활성화되어있는 것 같습니다 (쇼핑하지 않았습니다). 다음 명령을 사용하여 현재 디렉토리의 모든 파일을 다른 아카이브 폴더를 포함하지 mv !(arc*) archive_190629b
않고이

70

나는 전통적인 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 \;

1
강력한 도구 학습을 장려하기 때문에 공감했습니다. 공백이있는 파일의 경우 작동하지 않습니다. "find -print0 | xargs -0"을 고려하거나 xargs를 포기하십시오. "find [말한 내용] -exec mv -t {} ~ / Linux / New \;"
JasonSmith

mv 명령에 -t 옵션이 없으면 "find ... -exec mv {} Linux / New \;"를 사용하십시오. 또는 "find ... | xargs -I {} mv {} Linux / New"입니다. -t 옵션은 GNU 확장이며 Linux에는 적합하지만 다른 곳에서는 그렇지 않습니다.
Rob Kennedy

jhs, 오 실패. 나는 어떻게 든 xargs가 줄 바꿈에서 분리되었지만 공백이 아니라고 생각했습니다. "읽기"와 혼동 된 것 같습니다 :) 잘못된 문제
Johannes Schaub-litb

멋진 팁 주셔서 감사합니다! 나는 질문을 목표로하기 때문에 sth를 선택하려고했습니다. 그러나 나중에 명령의 유용성을 느낄 수 있으므로 "find and xargs"방식을 선택해야합니다. 그냥 바위입니다. 감사합니다 :)
Léo Léopold Hertz 준영

복잡한 방법. 더 많은 답변이보다 완전하고 쉬우 며 정확합니다
user637338

30

빠른 명령은 이동 명령이 일치하지 않도록 tux 파일 이름을 수정하는 것입니다.

예를 들면 다음과 같습니다.

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

""를 사용하지 마십시오 . " . "가있는 파일 만 이동합니다. 이름으로. "*"이면 충분합니다.
Juliano

1
*로 변경하면 이름이 바뀐 파일도 제거됩니다.
John T

6
@John T : 아니요. * glob은 점으로 시작하는 파일과 일치하지 않습니다.
Bill Karwin

이것이 가장 좋은 답변입니다. 이 답변을 수정하거나 언급 할 필요가 없습니다. 100 포인트 너무 감사합니다. 잘 했어!
Steve K

23

가장 쉬운 방법은 백틱을 사용하는 것입니다.

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


1
왜 사용하는지 설명해 주 grep -v시겠습니까?
Léo Léopold Hertz 준영

1
그렙 제외에 -v 옵션은 결과, 그것은 Tux.png 제외 걸릴 모든처럼
Rohail 압바스

1
이것은 확실히 직관적이지만 위의 답변이 더 좋습니다. 예를 들어 스크립트를 작성하는 경우 올바른 디렉토리에 있어야합니다.
nJGL

@nJGL 여기에도 절대 경로를 줄 수 있습니다. 질문이 있기 때문에 홈 디렉토리 (~)를 사용했습니다
Rohail Abbas

@RohailAbbas 박람회 충분합니다. ✌️
nJGL

14

bash의 경우 sth 답변 이 정확합니다. 다음은 zsh (선택한 쉘) 구문입니다.

mv ~/Linux/Old/^Tux.png ~/Linux/New/

필요 EXTENDED_GLOB설정하는 쉘 옵션.


3
두 개의 파일을 제외하려면 어떻게해야합니까?
mpen

13

나는 이것이 특정 파일이나 디렉토리를 제외하는 간단한 이동에 조금 더 안전하고 쉽게 의존한다는 것을 알았습니다.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

이것은 Busybox / ASH를위한 최상의 솔루션입니다
Stuart Cardall

1
이것은 몇 개의 폴더를 제외한 모든 파일을 다른 디렉토리로 이동
Umar Hayat

-l에 옵션은 ls명령 행에서 관련없는 정보를 많이 포함 MV 명령의 고장의 원인이됩니다.
jdhao

5

다음은 100 % 보장 된 방법이 아니며 스크립팅을 시도해서는 안됩니다. 그러나 때로는 대화식 쉘을 빠르게 사용하기에 충분합니다. 같은 파일 파일 glob

[abc]*

(a, b 또는 c로 시작하는 이름을 가진 모든 파일과 일치)는 "^"문자를 먼저 삽입하여 무시할 수 있습니다.

[^abc]*

예를 들어 다음과 같이 "lost + found"디렉토리와 일치하지 않기 위해 이것을 사용합니다.

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

물론 l로 시작하는 다른 파일이 있으면 나중에 처리해야합니다.


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

find 명령은 모든 일반 파일을 나열하고 fgrep 명령은 Tux.png를 필터링합니다. 백틱은 mv에게 결과 파일 목록을 이동하도록 지시합니다.


4
찾기를 다른 명령의 인수로 평가하지 마십시오. 나쁜 일이 일어날 것입니다. 방금 취약점을 만들었을 수 있습니다. 항상 find -print0 | xargs -0 구문 또는 -exec를 찾으십시오.
Juliano

3

폴더 안에있는 모든 것을 옮긴 다음 Tux.png를 다시 옮기는 것은 어떻습니까?

나는 "...를 제외한 모든 것"을 불쾌하게 표현하는 쉘 구문을 생각할 수 없다.


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
이 명령은 한 부분이 누락 된 것으로 보이며 컴퓨터에서 작동하지 않습니다. ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/대신 작동합니다.
캐서린 첸

3

어때요?

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

그래도 폴더에 있어야합니다.


3

다음 과 같이 grep건너 뛸 수 있습니다 .

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/

1

이것은 더 간단하고 기억하기 쉬울 수 있으며 저에게 효과적입니다.

mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination

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