반대 작업으로 스크립트를 생성하는 방법

반대 작업으로 스크립트를 생성하는 방법

정렬되지 않은 폴더의 다양한 파일 형식을 새로 생성된 디렉터리로 정렬하고 처리하는 대화형 스크립트가 있습니다.

필요한 경우 실행된 스크립트와 해당 정렬 프로세스를 다시 폴더(미리 정렬된) 상태로 확장/실행 취소할 수 있도록 작은 스크립트를 작성하거나 기존 스크립트를 수정하는 방법을 알고 싶습니다.

이를 달성하는 가장 효율적인 방법은 무엇입니까?

#!/bin/bash
read -p "Good Morning, Please enter your file type name for sorting [ENTER]:" all_extensions
if cd /Users/christopherdorman/desktop
  then  while read extension
      do    destination="folder$extension"
        mkdir -p "$destination"
        mv  -v unsorted/*."$extension" "$destination"
      done   <<< "${all_extensions// /$'\n'}"
        mkdir -p foldermisc 
        if mv  -v unsorted/* "foldermisc"
      then  echo "Good News, the rest of Your files have been successfully processed"
        fi
    for i in folder*/; do
        ls -S "$i" > "${i}filelist" 
        cat "${i}filelist" >> ~/desktop/summary.txt
    done
fi

답변1

다음은 (성공한) 명령 후에 호출할 수 있는 함수로 mv, 와 동일한 인수를 제공하며 mv, 함수는 파일을 원래 위치로 되돌려 놓아야 하는 해당 명령을 에코합니다. 또한 이러한 명령을 대체 파일로 리디렉션할 수도 있습니다. 또한 안전 예방 조치로 주석 처리됩니다.

function mvbackout {
  declare -a files
  for f
  do
    files+=("$f")
  done
  # remove the last parameter (the destination)
  unset files[$(( $# - 1 ))]
  dest=$f
  printf "# cd -- %s\n" "$PWD"
  for f in "${files[@]}"
  do
    printf "# mv -- '%s' '%s'\n" "${dest}/$(basename "$f")" "$f"
  done
}

이 함수는 데이터 손실 상황(초기 mv 명령으로 인해 실수로 파일이 손상되었거나 나중에 파일이 이동 또는 삭제됨)에서 복구할 수 없지만 기본적으로는 작동해야 합니다.

중요한 경고

셸 명령을 다시 셸로 다시 인용하는 것은 까다롭기 때문에 파일 이름을 작은따옴표로 묶었습니다. 이는 결과 명령을 복사/붙여넣기가 작동하지 않음을 의미합니다.만약에이 명령의 모든 파일 이름에는 작은따옴표가 포함되어 있습니다.

실행 예시는 다음과 같습니다.

$ mkdir dest
$ touch a b
$ mkdir -p subdir1/subdir2/subdir3 mkdir fun\'d\'ir fun\'d\'ir/fun\"d\"ir
$ touch subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e 
$ mv a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
$ mvbackout a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
# cd -- /home/schaller/tmp/dir
# mv -- 'dest/a' 'a'
# mv -- 'dest/b' 'b'
# mv -- 'dest/c' 'subdir1/c'
# mv -- 'dest/d' 'subdir1/subdir2/d'
# mv -- 'dest/e' 'subdir1/subdir2/subdir3/e'

스크립트의 경우 mv다음과 같이 각각 뒤에 다른 줄을 추가할 수 있습니다.

...
mv  -v unsorted/*."$extension" "$destination"
mvbackout unsorted/*."$extension" "$destination"
... 
if mv  -v unsorted/* "foldermisc"
then
   mvbackout unsorted/* "foldermisc" 
   echo "Good News, the rest of Your files have been successfully processed"
fi

관련 정보