다음과 같은 디렉토리가 있습니다
-rw-r--r-- 1 ualaoip2 mcm1 1073233 Sep 30 12:40 database.260.4-0.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1 502373963 Sep 30 12:40 database.260.4-1.tar.gz
-rw-r--r-- 1 ualaoip2 mcm1 880379753 Sep 30 12:40 database.260.4-2.tar.gz
drwxr-xr-x 2 ualaoip2 mcm1 4096 Sep 30 13:41 db0file
drwxr-xr-x 2 ualaoip2 mcm1 4096 Sep 30 13:41 db1file
drwxr-xr-x 2 ualaoip2 mcm1 4096 Sep 30 13:41 db2file
파일을 &c database...0
로 이동하고 싶습니다 .folder0
이를 수행하는 가장 좋은 방법은 무엇입니까? 다양한 변형을 시도했습니다
for i in $(ls fi*) do; mv $i ./folder$i
하지만 그들은 일부 항목의 이름을 바꾸고 내가 원하지 않는 많은 항목을 덮어썼습니다!
내가 사용해 본 변형
find . -maxdepth 1 -type d -printf '%f\n' | sort /* why is it not sorted?
그러나 현재 디렉토리로 .
mkdir db{0..7}을 사용하여 파일을 생성합니다. 이것이 최선의 방법입니까?
나는 그 답을 몇 단어로 설명할 수 있었으면 좋겠다. 원숭이가 보는 것뿐만 아니라, 원숭이가 하는 것도 말이다! :-)
답변1
파일 이름 형식을 사용할 수 있는 경우 다음 명령을 사용할 수 있습니다.
for i in $(seq 0 2); do mv database*-"$i".tar.gz "db${i}file"/; done
지침이 있습니다. 귀하의 파일은 안정적인 형식으로 나타나며 database*-NUMBER.tar.gz
디렉토리 이름에 동일한 번호가 있습니다 dbNUMBERfile
. 우리는 가장 높은 숫자(이 경우 0..2)를 생성하고 이 숫자에 대해 루프를 실행할 수 있습니다. 데이터베이스의 경우 경계에 $i
있으므로 단순하면 충분 하지만 변수가 정의되지 않아 작동하지 않으므로 다음을 사용해야 합니다. 중괄호를 사용 하면 올바르게 해결할 수 있습니다.-
.
db$ifile
$ifile
db${i}file
$i
답변2
set -o nullglob
for name in database*-*[0-9].tar.gz; do
num=${name##*-}
num=${num%%.*}
[ ! -d "folder$num" ] && mkdir "folder$num"
mv "$name" "folder$num"
done
database*-*[0-9].tar.gz
패턴과 일치하는 모든 파일 이름을 반복합니다 .
변수 num
는 파일 이름 끝에 있는 숫자(숫자는 두 자리 이상일 수 있음)가 되며, 먼저 이름부터 마지막 숫자까지 모든 것을 제거한 -
다음 점과 모든 것을 제거하여 파일 이름에서 선택됩니다.
대상 폴더가 아직 존재하지 않으면 생성됩니다.
nullglob
쉘 옵션을 first로 설정하면 bash
패턴이 파일 이름과 일치하지 않으면 루프가 전혀 입력되지 않습니다.
database*.tar.gz
원하는 경우 패턴을 변경할 수 있습니다. 루프에서 실제로 사용되는 이름의 모든 구성 요소가 존재하는지 확인하기 위해 약간 더 복잡한 패턴을 사용했습니다.