mv 명령을 사용하여 파일 세트를 한 폴더에서 다른 폴더로 이동하고 있으며 여기에는 파일 이름 바꾸기도 포함됩니다.
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat
나는 파일 세트에 위의 코드를 사용하고 있습니다. 유일한 차이점은 파일 이름과 변수 $t1의 값입니다. 예를 들어:
while loop required times
do
t1=<GetValueOfT1 >
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1_$$.dat
done
위 코드에서 t1의 값은 123,234,345입니다.
따라서 소스 디렉터리에 ABC_123.dat, ABC_234.dat, ABC_345.dat가 있으면 대상 디렉터리에는 ABC_123_1808.dat, ABC_234_1808.dat, ABC_345_1808.dat가 있습니다. 여기서 1808은 pid입니다.
하지만 결국 이동 대상 경로는 마지막 파일만 저장합니다. 대상 이름에서 "$$"를 제거하면 문제가 없습니다. 예를 들어:
mv <SRC_PATH>/ABC_$t1.dat <DEST_PATH>/ABC_$t1.dat
내가 뭘 잘못했나요?
답변1
명령이 존재합니다이 대규모 이름 변경을 위해.
개인적으로 나는 다음을 사용합니다 mmv
.
mmv <SRC_PATH>/"ABC_*.dat" <DEST_PATH>/"ABC_#1_$$.dat"
답변2
t1
쉼표로 구분된 값 집합을 포함하는 변수가 있다고 가정해 보겠습니다 .
t1=$(GetValueOfT1) # For example t1='123,456,789'
다음과 같은 루프를 통해 순차적으로 적용할 수 있습니다.
OIFS="$IFS" IFS=,
for v in $t1
do
echo "Processing with v=$v:" >&2
mv "$SRC_PATH/ABC_${v}.dat" "$DEST_PATH/ABC_${v}_$$.dat"
done
IFS="$OIFS"
첫 번째 값은 $t1
쉼표 문자로 값을 분할하기 위해 쉘이 필요하기 때문에 인용할 수 없습니다. (이것은 $IFS
루프가 끝날 때 복원할 수 있도록 저장하는 쉘 변수에 의해 제어됩니다 .) 나머지 변수는 실수로 공백, 쉼표 등으로 분리되는 것을 방지하기 위해 모두 따옴표로 묶어야 합니다. 마지막으로, $v
으로 렌더링해야 합니다 . 그렇지 않으면 쉘이 변수 이름의 일부로 ${v}
바로 뒤에 오는 문자를 포함하게 되는데 , 이는 우리가 원하는 것이 아닙니다._
$v_
아무것도 변경하기 전에 출력을 확인할 수 있도록 실제로 실행하기 전에 mv
접두사 (즉)를 추가하는 것이 좋습니다.echo
echo mv ...