특정 확장으로 모든 파일을 바꾸고 이동하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/556316

  •  05-09-2019
  •  | 
  •  

문제

나는 TCL (예상)을 배우고 이제는 흥미로운 문제에 왔습니다. Extension .Status의 파일의 무리를 이동/바꾸려면 명령이 필요합니다. 나는 이것들을 시도했다 :

spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir

물론, 그것은 작동하지 않았습니다. 나는 조금씩 굽고 글로그에 대해 무언가를 찾았지만, 내가 원하는 방식으로 작동하지 않는 것 같습니다. 만약 내가한다면:

exec /bin/mv [glob *.status] somedir

MV '1.STATUS 2.STATUS 3.STATUS ... ETC.' 유효한 파일이 아닙니다. 마치 파일의 전체 목록이 별도로 처리되는 대신 단일 문자열로 연결되는 것처럼 보입니다.

Google을 통해 더 많은 정보를 찾으려고 노력하면 많은 깨진 링크를 이끌어 내기 때문에이 문제를 해결하는 것 외에도 TCL/기대 기본 사항과 일반적인 함정에 대한 좋은 온라인 리소스를 지적 할 수 있습니다.

업데이트: 표준 TCL 및 표준 도구를 사용하는 솔루션 만 허용됩니다.

도움이 되었습니까?

해결책

$ ls -1
1.status
2.status
rename.tclsh*
some_dir/
two words.status

$ cat rename.tclsh
#!/usr/local/bin/tclsh

eval exec /bin/mv [glob *.status] some_dir

$ ./rename.tclsh

$ ls -1
rename.tclsh*
some_dir/

$ ls -1 some_dir/
1.status
2.status
two words.status

다른 팁

랜디의 대답은 짧고 정확하지만 필요없이 exec를 사용합니다. 조셉의 대답은 매우 강력하지만 조금 길다.

짧고 관용적 인 대답을 위해 사용합니다 (TCL 8.5 필요) :

파일 이름 바꾸기 { *} [glob *.status] some_dir

proc move_to_dir {filenames dirname} {
    foreach filename $filenames {
        file rename $filename [file join $dirname [file tail $filename]]
    }
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/

이 솔루션은 파일 등이 많은 경우 공백이 포함 된 이름이있는 파일과 함께 작동합니다.

exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir

그러나 /bin이 아닌 /usr /bin에 가장 자주있는 찾기와 xargs가 필요합니다.

복잡한 '찾기'명령을 사용할 때 안전 기능으로 데이터를 삭제하고 데이터를 삭제하면 명령 앞에 'echo'를 고정하고 파일에 캡처합니다.
그런 다음 '소스'를 사용하여 실행하기 전에 파일에 나열된 명령을 확인할 수 있습니다.

또한 가끔 에지 케이스 파일을 수동으로 처리하는 방법이기도합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top