Linux에서만 파일 이동

Linux에서만 파일 이동

모든 파일이 데이터 디렉터리에 있는 /participant/data 경로가 있습니다. 그러나 나는 디렉토리 구조가 모든 파일을 포함하는 하위 디렉토리가 있는 /participant/data/subdirectory가 되기를 원합니다. 파이프라인을 통과하려면 이와 같아야 합니다.

내 첫 번째 생각은

mkdir /참여자/데이터/하위 디렉터리/

mv /participant/data/*.* /participant/data/subdirectory/

그러나 파일에는 파일 확장자가 없으므로 *.*를 사용하면 작동하지 않습니다. 이를 수행하는 방법에 대한 제안이 있습니까?

답변1

모든 것을 옮기세요:

mv /participant/data/* /participant/data/subdirectory/

그러면 그 자체로 이동할 수 없다고 불평 subdirectory하지만 다른 모든 항목은 원하는 방식으로 해당 하위 디렉터리로 이동됩니다.

Bash는 다음과 같은 모든 것과 일치 shopt -s extglob하는 몇 가지 추가 와일드카드 문자를 추가합니다.!(xy|z)* 제외하고 xy또는 z:

shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/

(Zsh에는 파일만 일치시킬 수 있는 훨씬 더 확장된 와일드카드가 있을 수 있습니다.)

더 많은 하위 디렉터리가 있고 이를 건드리고 싶지 않은 경우 find또는 같은 도구를 fd사용하여 특정 항목(이 경우 파일만)에 대해서만 작업할 수 있습니다.

find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;

mv -t이는 다음을 사용 하면 약간 더 효율적입니다 -exec +.

find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +

이전(느린) 예제는 쉘 for루프로 작성할 수도 있습니다.

for x in /participant/data/*; do
    if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done

답변2

파일 이름과 관계없이 모든 파일을 포함하려면 *대신을 사용할 수 있습니다 .*.*

하지만 여기에는 을 포함한 디렉터리도 포함되므로 subdirectory파일을 이동할 때 제외해야 합니다.

이는 확장된 패턴 일치 기능을 사용하면 가능합니다. 먼저 해당 기능을 활성화해야 합니다(현재 세션에 대해).

$ shopt -s extglob

그런 다음 다음을 사용하여 하나를 제외한 모든 파일의 주소를 지정할 수 있습니다.path/!(excludedFile)

구현 국가 mv:

$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/

하나를 제외한 모든 파일을 이동하는 추가 옵션이 있습니다.https://www.baeldung.com/linux/move-all-files-Exception-one

답변3

설명하신 상황에서 가장 쉬운 방법은 다음과 같습니다.

cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory

*는 숨겨지지 않은 모든 디렉토리 항목, 즉 점으로 시작하지 않는 모든 항목과 일치합니다. 일시적으로 하위 디렉터리 이름을 점으로 시작했기 때문에 일치하지 않으며 데이터의 모든 항목이 이동됩니다. 이제 다른 하위 디렉터리와 같이 이동하고 싶지 않은 항목이 있는 경우 user1686의 자세한 답변과 같은 더 복잡한 방법 중 하나를 사용해야 합니다.

관련 정보