mv 명령은 파일 세트를 이동하고 이름을 바꿉니다.

mv 명령은 파일 세트를 이동하고 이름을 바꿉니다.

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접두사 (즉)를 추가하는 것이 좋습니다.echoecho mv ...

관련 정보