programing

하나의 파일을 제외한 모든 파일 이동

codeshow 2023. 4. 17. 22:08
반응형

하나의 파일을 제외한 모든 파일 이동

하나의 파일을 제외한 모든 파일을 이동하려면 어떻게 해야 합니까?다음과 같은 것을 찾고 있습니다.

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

을 새 로 옮깁니다.폴더를 제외하고Tux.png.!-sign은 부정을 나타냅니다.그일 위위 ?? ?? ?? ??

하여 bash를 extglob셸통통 ( 통통통통통통통통통 。

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

.bashrc에 다음 내용을 추가합니다.

shopt -s extglob

정규식을 확장합니다.다음으로 1개를 제외한 모든 파일을 이동할 수 있습니다.

mv !(fileOne) ~/path/newFolder

다른 명령어와 관련된 예외

디렉토리를 복사할 때 스레드에 표시된 이름으로 Forward-Flash를 사용할 수 없습니다.extglob은 breaking except condition입니까?

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

Backups.backupdb/여기서 부정은 잘못된 것이며, 다른 명령어와 함께 globs를 잘못 사용할 수 있고 다른 예외도 있을 수 있기 때문에 이동 디렉토리에서 사용하지 않을 것입니다.

저는 전통적인 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 'MV'가-tGNU를 사용하다 없는

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;

빠른 방법은 이동 명령이 일치하지 않도록 턱스 파일 이름을 변경하는 것입니다.

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

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는 ls --color로 에일리어스 됩니다.

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

감사합니다 @Arnold Roa

bash는 정답입니다.zsh(내 선택 셸) 구문은 다음과 같습니다.

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

필요EXTENDED_GLOB설정할 셸 옵션입니다.

특정 파일이나 디렉토리를 제외하는 간단한 이동에는 이 방법이 좀 더 안전하고 사용하기 쉽다고 생각합니다.

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

이것은 더 간단하고 기억하기 쉬울 수 있고 나에게도 효과가 있다.

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

다음은 100% 보장된 방법이 아니므로 스크립팅에는 전혀 시도하지 마십시오.단, 인터랙티브한 셸을 빠르게 사용할 수 있는 경우도 있습니다.파일 glob 같은 것

[abc]*

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

[^abc]*

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

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

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

그럼 어떻게 해?

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

폴더 안에 있어야 하는데.

이 일은 없어도 할 수 있다.grep다음과 같습니다.

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

주의:-Icaptial i이며 captial i를 만듭니다.ls명령어는 뒤에 나열된 Tux.png 파일을 무시합니다.

의 출력ls파이프로 연결되다mv경유로xargsmv의 소스 인수로 ls 출력을 사용할 수 있습니다.

ls -Q는 ls별로 나열된 파일 이름을 따옴표로 묶을 뿐입니다.

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

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

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

모든 파일(파일 제외 제외)을 except_file로 이동합니다.
find -maxdepth 1 -mindepth 1 -not -name except_file -print0 |xargs -0 mv -t ./except_file
예를 들어 (파일을 제외한 캐시는 현재)
find -maxdepth 1 -mindepth 1 -not -name cache -print0 |xargs -0 mv -t ./cache

언급URL : https://stackoverflow.com/questions/670460/move-all-files-except-one

반응형