2013-12-28 2 views
2

나는 보통 대시 '-'로 시작하는 파일 묶음을 얻는다. 이것은 모든 종류의 리눅스 명령을 수행 할 때 모든 문제를 일으키고 있습니다. 왜냐하면 이후의 모든 것은 플래그로 해석되기 때문입니다. 파일 앞에 대시 문자없이 파일의 이름을 바꾸는 가장 빠른 방법은 무엇입니까?배치 이름을 '-'로 시작하는 파일입니까?

mv -- -File1 File1 

로 이름이 변경됩니다 '-File1'그러나 나는 100의 이름을 변경해야하는 경우에 적합하지 않습니다 : 파일 name.For 예를 들어 앞에 '-'나는 수동으로 추가하여 각 파일의 이름을 바꿀 수 있습니다 파일을 즉시 업로드 할 수 있습니다. 현재 나는 그것을 내보내고 윈도우 프로그램을 사용하여 배치 이름을 바꾼 다음 리눅스 박스로 다시 업로드 할 수 있습니다.

답변

2

당신은 폴더의 유틸리티 - 리눅스 패키지가있는 경우 (대부분합니까?) :

rename - '' ./-* 

man rename

4

이러한 파일을 참조하는 가장 쉬운 방법은 ./-File1입니다. (파일이 현재 디렉토리에 있다면 어쨌든 문제가 발생합니다.) 그렇게 익숙해지면 아마별로 나쁘지 않을 것입니다.

무언가 같이 대량하려면 이름을 바꾸, 당신이 할 수 있습니다 :

for f in -*; do mv "./$f" "${f#-}"; done 

참고 : @shellter 코멘트에서 알 수 있듯이, 영업 이익의 예제를 재현,

for f in -*; do mv "./$f" "renamed$f"; done 

또는 위의 경우에만 -이라는 단일 이름 만 제거됩니다.

+1

OP의 예제를 보면 mv의 ​​대상은 "$ {f # -}"'일 수 있습니다. 모두에게 행운을 빕니다. – shellter

+0

감사합니다. 두 방법 모두 문제를 해결하는 데 도움이됩니다. 하나의 질문은 "# ~"무엇입니까? 나는 주위를 봤 거든 그것이 무엇을 찾을 수 없습니다. 변수 f의 값에 첫 번째 문자를 삭제하도록 요청하는 일종의 정규식입니까? – user2476714

0

쉘에서 이렇게하는 것이 더 쉽지만, 특별한 경우가 걱정되거나 perl을 사용하는 경우 몇 가지 방법이 있습니다. 하나는 File::Copy mv 사용하는 것입니다

use strict; 
use warnings; 
use File::Copy qw(mv); 

opendir(my $dir, ".") or die "Can't open $!"; 
foreach my $file (readdir($dir)) { 
    my $new_name = $file =~ s/^-+//r; #works if filename begins with multiple '-'s 
    if ($new_name ne $file) { 
     say "$file -> $new_name"; 
     mv $file, $new_name; 
    } 
} 

을하거나 rename 내장을 사용하지만, 이것은 이론적으로 일부 시스템 구현을 위해 작동하지 않을 수 있습니다

rename $file, $new_name; #instead of mv $file, $new_name; 

를 두 경우 모두, 새로운 이름의 파일이 존재하는 경우 자동으로이 코드로 덮어 씁니다. 당신은 그 돌봐 몇 가지 논리를해야 할 수도 있습니다

# Stick inside the "if" clause above 
if (-e $new_name) { 
    say "$new_name already exists!" 
    next; 
} 
0

발견 사용 :

find -name '-*' -exec rename -- - '' {} \; 
관련 문제