많은 하위 디렉터리가 포함된 디렉터리가 있습니다. 이러한 모든 하위 디렉터리에는 각각 고유한 이름을 가진 파일이 포함되어 있습니다. 모든 하위 디렉터리의 모든 파일을 가져와서 모두 하나의 디렉터리로 이동하고 싶습니다.
수백 개의 하위 디렉터리가 있으므로 이 작업을 수동으로 수행하고 싶지 않습니다. 이를 위해 쉘 스크립트를 어떻게 작성합니까? 나는 배쉬를 사용하고 있습니다.
답변1
find
해결책은 다음과 같습니다.
find /srcpath -type f -exec mv {} /dstpath \;
아니면 더 나은 방법은 다음과 mv
같습니다 -t destination-dir
.
find /srcpath -type f -exec mv -t /dstpath {} +
답변2
단일 레벨 하위 디렉토리가 있는 경우 간단한 방법은 다음과 같습니다.
cd source_directory
mv -- */* /path/to/target/directory
파일을 상위 디렉터리, 즉 로 이동하려는 경우 이름이 ("점 파일")로 시작하는 파일이나 디렉터리는 제외됩니다 mv -- */* .
. .
Bash에 포함하려면 먼저 를 실행하세요 shopt -s dotglob
. zsh에서 setopt glob_dots
먼저 실행하십시오.
하위 하위 디렉터리 등에서 파일을 재귀적으로 이동하려면 다음을 사용하세요 zsh
.
cd source_directory
mv -- */**/*(^/) .
명령 을 실행하려고 할 때 mv
"명령줄이 너무 깁니다"와 같은 오류가 발생하면 이를 분석해야 합니다. 가장 쉬운 방법은 find
GNU 도구(내장되지 않은 Linux 및 Cygwin)를 사용하는 것입니다.
find source_directory -mindepth 2 ! -type d \
-exec mv -t /path/to/target/directory -- {} +
답변3
#! /bin/sh
# set your output directory here
outdir=./Outdir
# get a list of all the files (-type f)
# in subdirectories (-mindepth 1)
# who do not match the outdir (-path $outdir -prune)
# and step through and execute a move
find . -mindepth 1 -path $outdir -prune -o -type f -exec mv '{}' $outdir \;
이렇게 하면 현재 작업 디렉터리, 모든 하위 디렉터리에서 검색하고 동일한 작업 디렉터리($outdir)의 하위 디렉터리로 파일을 이동할 수 있습니다. 제대로 작동하려면 -prune 경로에 ./가 있어야 합니다.