특정 확장으로 모든 파일을 바꾸고 이동하는 방법은 무엇입니까?
문제
나는 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'를 고정하고 파일에 캡처합니다.
그런 다음 '소스'를 사용하여 실행하기 전에 파일에 나열된 명령을 확인할 수 있습니다.
또한 가끔 에지 케이스 파일을 수동으로 처리하는 방법이기도합니다.