Linux sh 스크립트를 찾고 있어요
- 폴더를 구문 분석하여 특정 확장자를 찾습니다.
- 파일 이름의 일부를 기준으로 이러한 모든 파일을 폴더에 복사합니다.
지금까지 두 개의 명령줄을 성공적으로 만들었습니다.
파일 이름의 일부를 기반으로 폴더를 만드는 방법 중 유일하게 누락된 점은 현재 폴더 대신 "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와 유틸리티를 사용해야 한다면 다음과 같이 하세요.zsh
zmv
sh
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 ' \;