mv를 사용하여 루프에서 이름이 다른 여러 파일을 이동하는 방법은 무엇입니까?

mv를 사용하여 루프에서 이름이 다른 여러 파일을 이동하는 방법은 무엇입니까?

L의 범위는 1에서 10이고 K의 범위는 0.00에서 49.80인 LposK.dat라는 파일이 2500개 있습니다. 동일한 K를 가진 항목을 폴더로 옮겨야 합니다. 나는 다음 방법을 사용하여 이 작업을 수행했습니다.

find . -name '*posK.dat' -exec mv {} ~/destination/K \;

하지만 수동으로 K 값을 변경하고 이를 여러 번 반복해야 합니다. 이 작업을 수행하는 스크립트를 작성할 수 있도록 find 및 mv 명령과 함께 루프 인덱싱(예: for 루프)을 사용할 수 있는 방법이 있는지 궁금합니다.

답변1

K에서 가져오려면 LposK.dat문자열이 에 있으면 $name다음을 수행할 수 있습니다.

k=${name%.dat}  # remove ".dat" suffix
k=${k##*pos}    # remove everything up to end of (the last) "pos"

$name이는 나중에 some/path/LposK.dat.some/pathposfind

파일 이동:

k=${name%.dat}
k=${k##*pos}

dest="$HOME/destination/$k"
mkdir -p "$dest" && mv "$name" "$dest"  # only move if mkdir did not fail

그리고 find:

find . -type f -name '*pos*.dat' -exec sh -c '
    for name do
        k=${name%.dat}
        k=${k##*pos}

        dest="$HOME/destination/$k"
        mkdir -p "$dest" && mv "$name" "$dest"
    done' sh {} +

이렇게 하면 sh -c내부 스크립트에 여러 경로 이름이 인수로 제공되고 스크립트는 이러한 경로 이름을 반복하여 각 경로를 $HOME/destination.

관련된:


파일이 단일 하위 디렉터리(현재 디렉터리)에 있는 경우 다음 없이 이 작업을 더 쉽게 수행할 수 있습니다 find.

for name in ./*pos*.dat; do
    [ ! -f "$name" ] && continue  # skip non-regular files

    k=${name%.dat}
    k=${k##*pos}

    dest="$HOME/destination/$k"
    mkdir -p "$dest" && mv "$name" "$dest"
done

관련 정보