파일 목록을 위치 목록으로 이동

파일 목록을 위치 목록으로 이동

여러 파일을 동시에 특정 새 위치로 이동하고 싶습니다.

내가 다음을 가지고 있다고 가정 해 봅시다

wrong name  | c.txt | a.txt | b.txt |
Correct name| a.txt | b.txt | c.txt |

그럼 나는 다음과 같은 일을하고 싶다

mv ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}

그런데 오류가 났어요

답변1

참고하세요

mv ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}

다음으로 확장

mv ./a.txt ./b.txt ./c.txt ./b.txt ./c.txt ./a.txt

유틸리티를 호출하기 전에 mv. 피연산자가 2개 이상이고 마지막 피연산자가 디렉터리가 아니기 때문에 오류가 발생합니다. 마지막 피연산자가 디렉터리의 경로 이름인 경우 모든 파일이 해당 디렉터리로 이동합니다(일부 파일을 두 번 지정하면 오류가 발생할 수도 있습니다).

대신, 파일을 한 번에 하나씩 임시 디렉토리로 이동하고 이름을 올바른 이름으로 바꾸십시오. 그런 다음 다시 이동하십시오.

mkdir t
mv a.txt t/b.txt
mv b.txt t/c.txt
mv c.txt t/a.txt
mv t/*.txt ./
rmdir t

이 작업에 대한 바로가기는 없으며 mv유틸리티는 한 번에 하나의 파일 이름만 바꿀 수 있습니다.

답변2

@Kusalananda의 답변에 추가:

함수를 사용하여 일반화할 수 있습니다.

mv_files() {

  local args=("$@")
  local num_args=${#args[@]}

  if [ $(bc <<< "$num_args%2") -ne 0 ]; then

    echo "Number of arguments must be a multiple of 2."
    return 1

  else

    num_files=$(bc <<< "$num_args/2")
    tmpdir=$(mktemp -d -p .)
    for (( i=0;i<num_files;i++ )); do
      local n=$(bc <<< "$i+$num_files")
      mv "${args[$i]}" "${tmpdir}/${args[$n]}"
    done

    mv ${tmpdir}/* .
    rmdir ${tmpdir}
    echo "Done."

  fi
}

그런 다음 다음과 같이 실행합니다.

mv_files a.txt b.txt c.txt b.txt c.txt a.txt

또는 다음과 같이 하세요.

mv_files ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}

또는

old=( a.txt b.txt c.txt )
new=( b.txt c.txt a.txt )

mv_files "${old[@]}" "${new[@]}" 

답변3

Tried by below method

aveen_linux_example ~]#  sed -n '/wrong name/p' filename | sed "s/|//g" | sed "s/ /\n/g"| sed '/^$/d'|awk '$1 !~  /wrong/ && $1 !~/name/{print $0}' > final.txt
[root@praveen_linux_example ~]# sed -n '/Correct name/p' filename| sed "s/|//g" |sed -r "s/\s+/\n/g"| sed '/^$/d'| awk '$1 !~/Correct/ && $1 !~/name/{print $0}' >final_2.txt


paste final.txt final_2.txt | awk '{print "mv" " " $1 " "  $2}'| sh

관련 정보