파일 이름의 일부를 기반으로 대상 디렉터리에서 파일을 찾아 복사합니다.

파일 이름의 일부를 기반으로 대상 디렉터리에서 파일을 찾아 복사합니다.

Linux sh 스크립트를 찾고 있어요

  1. 폴더를 구문 분석하여 특정 확장자를 찾습니다.
  2. 파일 이름의 일부를 기준으로 이러한 모든 파일을 폴더에 복사합니다.

지금까지 두 개의 명령줄을 성공적으로 만들었습니다.

파일 이름의 일부를 기반으로 폴더를 만드는 방법 중 유일하게 누락된 점은 현재 폴더 대신 "Out" 폴더에 이러한 폴더를 모두 만드는 것을 선호한다는 것입니다.

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) \
 | tr -s '[:blank:]' '_' \
 | cut -d"-" -f1 \
 | xargs mkdir -p

두 번째는 정적 폴더 Out에 있는 모든 파일을 복사합니다.

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) -exec cp '{}' Out \

두 명령을 결합하여 이름을 기준으로 하위 폴더에 파일을 복사할 수 없습니다(또는 하위 폴더가 없는 경우 하위 폴더를 생성).

도와 주셔서 감사합니다!

답변1

prename여기 에서는 전용 파일 이름 바꾸기 도구(예: mmv또는 . 하지만 POSIX와 유틸리티를 사용해야 한다면 다음과 같이 하세요.zshzmvsh

find . ! -name . -prune \( -name '*.xxx' -o -name '*.yyy' \) -type f -exec sh -c '
  ret=0
  for file do
    name=${file##*/}
    dstdir=Out/$(printf "%s\n" "${name%%-*}" | tr -s "[:space:]" "[_*]")
    mkdir -p "$dstdir" &&
      cp "$file" "$dstdir/" &&
      true > "$file" || ret=$?
  done
  exit "$ret"' sh {} +

(또한 여러 GNUism을 피합니다).

답변2

나는 그것을 두 부분으로 나누어서 할 것이다:

먼저, 아까와 같이 디렉터리를 생성하세요.

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) \
| tr -s '[:blank:]' '_' \
| cut -d"-" -f1 \
| xargs mkdir -p

두 번째는 bash 중괄호 확장을 활용합니다 ...

find . -maxdepth 1 -type d -not -name '.' -exec bash -c 'cp ${1}*.{xxx,yyy} ${1}/' _ {} \;

결과:

$ tree
.
├── 519_RU
│   ├── 519_RU-1801013_20181217_141826_656.xxx
│   └── 519_RU-1801013_20181217_143011_657.xxx
├── 519_RU-1801013_20181217_141826_656.xxx
├── 519_RU-1801013_20181217_143011_657.xxx
├── 825_RU
│   └── 825_RU-1809008_20190723_015635_947.yyy
├── 825_RU-1809008_20190723_015635_947.yyy
└── AB47

in xxx yyy확장된 목록을 생성하는 명령을 대체할 수 있습니다 .

답변3

도움을 주셔서 감사합니다. 마침내 저에게 많은 도움이 되었던 또 다른 주제를 바탕으로 해결책을 찾았습니다.여기.

아래에서 찾아보세요:

find -maxdepth 1 -type f \( -name "*.xxx" -o -name "*.yyy" \) -size +0 -exec env file={} bash -c 'base="$(basename "$file" | tr -s '[:blank:]' '_' |cut -d"-" -f1)" ;dir="Out/${base%.*}";mkdir -p "$dir";cp "$file" "$dir" ; truncate "$file" -s 0 ' \;

관련 정보