원래 제목은 다음과 같습니다.vim과 같은 명령 시퀀스를 사용하여 vidir 주입
누군가가 실수로 이름을 바꾼 여러 파일의 이름을 바꾸기 위해 vidir을 사용하려고 했습니다. 문제는 vidir이 파일의 정렬 순서를 사용하지 않고 때로는 무작위로 선택한다는 것입니다. 내 파일이 엉망이 되어 ls -rt를 사용하여 이름을 바꿔야 했습니다.
질문:
파일 이름은 모두 무작위로 변경됩니다. 하지만 ls -rt 순서로 모든 파일 이름이 포함된 텍스트 파일이 있습니다. 해당 텍스트 파일을 사용하여 이름을 읽고 ls -rt
순서를 사용하여 폴더에 있는 파일의 이름을 바꾸고 싶습니다.
ls -rt
산출
cbb308e52a3345e4ff436b2f
a4b8e2aacae0a3304b3c28b8
43ca3253da336012788d3279~
ada694316cc605c7ffb790d1
3b6cc01ff2aaa5b1709918ef
7057cbda90a7adf303a56bb4~
7c0dd50bc52bb444000cc175
Txt_with_Names_In_Order
e0e87002d27674ddafdb5f7077887da6-1.ps
c7685093e84da8074859efc5783687b6-2.ps
062936279f54f4f5a541b5bee4daf5d4-3.ps
6f91bb10840a4a5a5331c832e5c2beb1-4.ps
9a8c5e9ae8b633a2a588518d2b9ab656-5.ps
bcb77709b10eafbd2fc88ce8db41ed3f-6.ps
e65c35be3c8b0aa051fb33ed2ce43ff7-7.ps
해결책:
이제는 루프를 통해 수행할 수 있지만 vidir이 곧 유용해지면 긴 루프 명령을 작성하는 것이 불가능합니다.
내 vim 명령 시퀀스에는 다음이 포함됩니다.
^[ggVGg^A some regex
ls -rt | vidir -
위의 방법은 작동하지만 대화형으로 작동해야 합니다.
이와 같은 시퀀스를 삽입하고 싶습니다
ls -rt | vidir - << EOF
commands
EOF
또는
vim file << EOF sequence EOF ------> it works
command | vim - << EOF sequence of vim commands to edit input ELF ----> Want a workaround for this
하지만 입력 내용이 모순되는 것 같습니다.
가능하다면 누구든지 도울 수 있습니다.
[예상을 사용하고 싶지 않음] 누구든지 도와줄 수 있나요?
vim ex 모드의 명령줄에서 ^[ggVgg^A를 직접 사용하는 방법은 무엇입니까?
내가 시도하는 것은 일부 명령의 출력을 vim으로 파이프하고 해당 파이프 입력에 대해 비대화식으로 작동하도록 일련의 vim 명령을 삽입하는 것입니다.
답변1
귀하의 솔루션 요청은 다음을 기반으로 vim
하거나 vidir
일반적 입니다.XY 문제.
귀하의 질문을 이해하면 실제 요구 사항은 현재 디렉토리의 기존 파일 이름을 텍스트 파일의 순차적 이름으로 바꾸는 것입니다 ls -rt
.
다음 해결 방법 bash
에서는 현재 파일 이름이나 저장된 파일 이름에 공백, 줄 바꿈 또는 기타 문제가 있는 문자가 포함되어 있지 않으며 텍스트 파일에 한 줄에 하나의 파일 이름이 포함되어 있다고 가정합니다.
readarray -t new < /path/to/filenames.txt ; \
i=0 ; \
ls -rt1 | while read -r old
do
echo mv "$old" "${new[$i]}"
((i++))
done
위 스크립트는 실행될 명령만 표시합니다. 출력이 요구 사항과 일치하면 echo
이전 콘텐츠를 삭제 mv
하고 스크립트를 다시 실행하여 실제로 파일 이름을 바꿉니다.
답변2
이 문제는 쉘 명령(bash)을 통해 쉽게 해결할 수 있습니다. 폴더를 백업하는 것부터 시작하세요.
잘못된 이름을 올바른 순서로 포함하는 파일을 만듭니다. ls -tr > badnames.txt
따라서 두 파일은 올바른 순서로 좋은 이름과 나쁜 이름을 갖습니다. 함께 병합:
paste badnames.txt TXT_with_Names_In_Order > bothnames.txt
마지막 입력:
while read BADNAME GOODNAME
do
mv $BADNAME $GOODNAME
done < bothnames.txt
이 코드는 Bothnames.txt 파일에서 한 줄을 읽고 이를 두 개의 변수로 나눕니다. 그런 다음 mv 명령을 사용하여 파일 이름을 바꿉니다.