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/path
pos
find
파일 이동:
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