파일 그룹을 이동하여 모든 파일에 대한 확인 메시지를 사용자에게 표시


9

시스템 : Ubuntu MATE 18.04.

파일 모음 (디렉토리 구조의 여러 디렉토리에 있음)이 있으며 많은 파일을 다른 디렉토리로 옮기고 싶습니다. 이름으로 이동하려는 파일 (레시피 제목)을 알 수 있지만 이동하려는 파일과 이동하고 싶지 않은 파일을 구분하는 다른 방법은 없습니다. 이름을 직접 검사하여 모든 파일을 결정해야합니다.

따라서 이동하려는 각 파일에 대해 명령을 한 번 실행합니다.

mv Snacks/OkaraCrackers NeedsTesting/
mv Snacks/SunflowerBrittle NeedsTesting/
mv Treats/ChocolateChilliFudge NeedsTesting/
mv Treats/PecanBlondies NeedsTesting/

탭 완성에도 불구하고 이것은 너무 많은 타이핑입니다. 내가 정말로하고 싶은 것은

shopt -s globstar
mv --prompt-me-for-every-file ** NeedsTesting/

각 파일마다 y또는 n을 누를 수 있습니다 .

파일 그룹을 이동하고 모든 파일에 대해 확인 메시지를 표시하려면 어떻게해야합니까?

답변:


6

방법 1 : 그래픽 파일 브라우저에서 트리보기 사용

귀하의 실제 목표는 각 파일을 선택하고 프롬프트하라는 메시지 를 엄격하게 말하는 것이 아니라고 가정합니다 . 그러나 터미널의 각 파일에 대한 메시지가 표시되도록하려면 아래의 방법 2를 참조하십시오.

대부분의 그래픽 파일 브라우저는 여러 레벨의 디렉토리 계층을 함께 볼 수있는 트리보기를 지원합니다. 개별적으로 또는 파일을 선택한 다음 전체 선택에서 조작하여이보기에서 파일을 복사하거나 이동할 수 있습니다. 이것은 여러 폴더의 파일에서도 작동합니다.

일부 파일 브라우저에서는 트리보기를 활성화하려면 환경 설정 메뉴로 이동해야합니다. MATE 파일 브라우저 인 Caja에서는 목록보기에서 항상 활성화되어 있습니다. 보기 → 목록을 클릭하거나 Ctrl+ 2를 눌러 목록보기로 전환하십시오. 각 디렉토리는 왼쪽에 작은 오른쪽을 향한 삼각형이있어 확장 할 수 있음을 나타냅니다. 폴더를 확장하려면 해당 삼각형을 클릭하거나 폴더를 선택할 때 (오른쪽 화살표) 키를 누르십시오 . 이 예에서는 하나씩 하나씩 선택하고 대상을 한 번에 드래그합니다.

Caja 파일 브라우저의 트리 구조에서 선택된 여러 파일을 다른 폴더로 끌어 놓았지만 아직 이동하지 않은 경우

소스와 대상이 동일한 드라이브에 있다고 가정하면 기본적으로 드래그가 움직입니다. 대신 복사하려면 Ctrl키를 누르고 있습니다.

드래그 이동이 완료된 후 선택한 파일이 이제 원래의 개별 위치 대신 대상 폴더에 모두 함께있는 상황

이론적으로이 방법을 사용할 때 실수를 쉽게 해결할 수 있습니다. 대부분의 파일 브라우저 (Caja 포함)는 배치 작업을 포함한 최근 작업을 취소하기 위해 Ctrl+ Z를 지원하기 때문 입니다. 그러나 나는 그와 운이 혼합되었습니다. 때때로 파일이 잘못된 폴더로 돌아갑니다.

좋은 소식은 대부분 작은 텍스트 문서로 작업하는 것처럼 보이므로 tar번거 로움없이 먼저 추가 백업을 만들 수 있다는 것입니다. 어떤 방법을 사용하든 관계없이 그렇게하는 것이 좋습니다.

방법 2 : 행동 find과 명령-ok

find파일을 찾고 -exec-execdir작업 을 사용하여 임의의 외부 명령으로 경로를 전달하는 것이 일반적으로 사용 됩니다 . 그러나 find또한 가지고 -ok-okdir프롬프트 때마다 전에이 명령을 실행합니다. 각 파일에 대해 터미널에서 실제로 묻는 메시지가 표시되면 이것이 방법이라고 생각합니다.

위에 표시된 것과 동일한 효과를 생성하면 다음과 같습니다.

ek@Gnar:~$ find Texts -xtype f -ok mv -t 'Glorious Destination Folder' {} \;
< mv ... Texts/Robert Frost/New Hampshire.pdf > ? y
< mv ... Texts/Robert Frost/In The Clearing.pdf > ? n
< mv ... Texts/Helen Keller/The Story of My Life.pdf > ? y
< mv ... Texts/Saki/The Short Stories of Saki.pdf > ? y
< mv ... Texts/Jane Austen/Sense and Sensibility.pdf > ? n
< mv ... Texts/Jane Austen/Pride and Prejudice.pdf > ? y
< mv ... Texts/Richard Connell/The Stolen Crime.pdf > ? n
< mv ... Texts/Richard Connell/The Most Dangerous Game.txt > ? y
< mv ... Texts/Mary Wollstonecraft Shelley/Mathilda.epub > ? n
< mv ... Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf > ? y
< mv ... Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf > ? n
< mv ... Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm > ? y

Texts소스 디렉토리 (원하는 .경우 cd)와 Glorious Destination Folder실제 대상 디렉토리로 바꿉니다 .

이것은 파일 당 하나의 명령을 실행합니다. 달리 -exec하고 -execdir, -ok그리고 -okdir지원하지 않는 +대신에 \;명령의 동일한 호출에 여러 FOUND 경로를 통과 할 수 있습니다. 따라서 의 형식 을 사용할 필요 가 없습니다 . 난 둘 다,하지만, 어쨌든 일을 제안 일반적 으로 프롬프트가 더 그들에 대해 메시지를 표시하고있는 명령처럼, 그래서 특히이 상황에서.-t destmvfind

해당 명령이 작성 될 find때 궁극적으로 일반 파일을 가리키는 기호 링크가 발견 되면 해당 명령 (대상이 아닌 링크)이 무시되지 않고 이동됩니다. 실제로 하나의 일반 파일 만 조작하려면 -type f대신을 사용하십시오 -xtype f.

당신이 script실수를했을 때 무슨 일이 있었는지 알아낼 수 있도록 세션 에서 이것을하고 싶을 수도 있습니다 . 그러나 다시 백업을하지 않아도됩니다.

방법 3 : 매니페스트 생성 및 편집

적어도 파일 이름에 개행 문자가없는 한 간단한 find명령을 사용하여 매니페스트 (이 경우 잠재적으로 관심이있는 파일의 이름을 나열하는 파일) 를 생성하는 것으로 시작할 수 있습니다 . :

find Texts -xtype f >manifest

대체 manifest어떤으로는 파일처럼 이름이 고려 목록 파일을 (그리고 그에 따라 나머지 방향을 조정).

위와 같이 대체 Texts할 수있는, 실제 소스 디렉토리와 .당신이 한 경우 cd그것을 '라합니다. 그러나 Texts상대 경로 인 경우 (포함하는 경우 포함 .) 실제로 이동을 수행 할 때 나중에 같은 위치에 있어야합니다.

해당 find명령을 실행 한 후 manifest텍스트 편집기에서 엽니 다 . 이 수 nano, vim, emacs, gedit, pluma, 등 편집기에서 밖으로 코멘트 이름은 당신이 파일을하는 줄 하지 않는 를 배치하여 이동하려는 #이들의 시작 부분에. 일부 편집기는 파일이 주석이있는 형식으로 인식되지 않는 경우에도 해당 행을 다르게 강조 표시합니다. 그러나 대부분은 그렇지 않으며, 이런 식으로 제안하는 실제 이유는 인간으로서 구성 파일 (및 아마도 소스 코드)에서 줄을 주석 처리 한 경험이 있기 때문입니다. 나는 당신이 라인을 표시하는 것보다이는 경향이보다 직관적 인, 덜 오류라고 생각 합니까 이동하고자합니다.

물론, 이동하고 싶지 않은 파일의 행을 삭제할 수도 있습니다. 주석 처리의 장점은 나중에 수행 한 작업이 나중에 명확하다는 것입니다.

내 예에서, 파일을 편집 한 후의 파일 내용은 다음과 같습니다.

Texts/Robert Frost/New Hampshire.pdf
# Texts/Robert Frost/In The Clearing.pdf
Texts/Helen Keller/The Story of My Life.pdf
Texts/Saki/The Short Stories of Saki.pdf
# Texts/Jane Austen/Sense and Sensibility.pdf
Texts/Jane Austen/Pride and Prejudice.pdf
# Texts/Richard Connell/The Stolen Crime.pdf
Texts/Richard Connell/The Most Dangerous Game.txt
# Texts/Mary Wollstonecraft Shelley/Mathilda.epub
Texts/Mary Wollstonecraft Shelley/Frankenstein: Or, The Modern Prometheus.pdf
# Texts/W. E. B. Du Bois/The Souls of Black Folk.pdf
Texts/W. E. B. Du Bois/Darkwater: Voices from within the Veil.htm

그런 다음 주석 처리 된 행을 필터링 grep하고 결과를 파이프하여 xargs전달할 수 있습니다 mv.

grep -Pv '^\s*#' manifest | xargs -d '\n' mv -t 'Glorious Destination Folder'

위와 같이 Glorious Destination Folder실제 대상 이름으로 바꿉니다. 그게 다야; 파일이 이동되었습니다. 원하는 경우 먼저 실행될 명령을보기 echo전에 미리 쓸 수 있습니다 mv.

명령이 작동하는 방식은 다음과 같습니다.

  1. grep명령어 출력 라인은 manifest하지 ( -v) (시작 ^옵션 (사용)을 *) 공백 ( \s리터럴 하였다) #캐릭터. -P플래그 (가능하게하는 정규 표현식의 방언으로 PCRE를 선택 \s나는 기존보다 더 읽을 생각한다 [[:space:]]).
  2. xargs명령 (의 출력 인 입력 분할 grep개행 말단 필드 (로)를 -d '\n'한 후,) 명령의 끝 부분에 개별 인자로 (종단 개행없이) 각 필드 풀칠 mv -t 'Glorious Destination Folder'이 실행.

1
-okIMHO 최고의 답변
pim

7

다음은 작은 스크립트 ( mv-confirm.sh)입니다.

#!/bin/bash

# Just make sure there are at least one source and one destination
if [ "$#" -lt 2 ]; then
    echo "Illegal number of parameters"
fi

DESTINATION=${*:$#}             # last argument
SOURCES=( ${@:1:$#-1} )         # all but last arguments

for i in "${SOURCES[@]}"
do
    read -p "move '$i' to '$DESTINATION' ? [y/n] " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
        echo mv "$i" "$DESTINATION"
    fi
done

샘플 사용 :

./mv-confirm.sh ** somewhere
move 'a' to 'somewhere' ? [y/n] n
move 'b' to 'somewhere' ? [y/n] y
mv b d
...

스크립트를 실행 가능하게 만드는 것을 잊지 마십시오 ( chmod +x mv-confirm.sh).

NB

파일을 엉망으로 만들고 싶지 않기 때문에 echo실제 mv 명령 앞에 추가했습니다 . 실제로 파일을 이동하려면 제거하십시오.

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