시작 부분에 점과 공백이 있고 끝에 점이 누락된 jpg 파일을 변경하려고 합니다( 아래 . Startjpg
그림 참조 ).Start.jpg
요점은 파일을 숨기고 sed
해당 ls -al
파일을 나열하므로 ls -al
온라인 sed
에서 많은 설명서를 읽었지만 항상 이 오류가 발생합니다.
sed: -e expression #1, char 6: unknown command: `/'
나는 노력했다
ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'
더 많은 것이 있습니다.
또한 filejpg를 file.jpg로 변경해야 합니다.
답변1
Perl rename
도구 사용(Debian 및 Ubuntu를 포함한 친구들에서는 이 도구라고 하며 다른 곳에 rename
있을 수도 있음 prename
):
rename -n 's/(?<!\.)jpg$/.jpg/' * # -n makes it show you what it'll do,
# but not actually do it. Remove the -n to
# actually rename
이 패턴을 분석해 보겠습니다. jpg$
이는 "'jpg'로 끝남"을 의미합니다. (?<!\.)
"'jpg' 앞에 점이 없음"을 의미합니다 . 이것은 당신이 어리석은 일 이 foo.jpg
되는 것을 막을 것입니다 .foo..jpg
*
일반 쉘 와일드카드 로 rename
이름 바꾸기를 고려할 파일 목록을 얻습니다. 당신은 확실히 이것을 할 수 있고 /path/to/dir/*
, 파일 이름 목록을 전달하고, find
다른 것들 과 결합할 수 있습니다.
처음부터 점과 공백을 제거하는 것도 매우 쉽습니다.
rename -n 's/^[. ]+//' * # trying -n first is good practice
그러면 모든 선행 점과 공백이 제거됩니다. 될 것 . . . foo
입니다 foo
.
일반적으로 *
쉘 확장은 이름이 점으로 시작하는 파일(숨겨진 파일)을 생성하지 않습니다. 한 가지 옵션은 을 사용하는 것입니다 .*
. 이렇게 하면 두 개의 특수 항목 .
(현재 디렉터리)과 ..
(상위 디렉터리)도 생성됩니다. 이 경우에는 해가 없습니다. 첫 번째 명령은 이를 무시합니다( 로 끝나지 않음 jpg
). 두 번째 명령은 이름을 바꾸려고 시도하지만 오류가 발생합니다. 또 다른 옵션은 다음을 찾는 것입니다.
find -type f -exec rename -n 's/^[. ]+//' '{}' +
-type f
파일로 제한됩니다. 물론, find의 다른 옵션을 사용할 수도 있습니다.
답변2
sed
매우 유용하고 다양한 도구임에도 불구하고 올바르게 사용하고 있지 않습니다. 텍스트 파일의 문자열을 일치시키고 바꾸는 데 가장 적합합니다. 파일 시스템에서 파일 이름을 직접 바꿀 수는 없습니다.
이 작업은 bash 단일 라이너에 더 적합합니다(쉘이라고 가정). . filejpg
와 같은 이름 을 바꾸려면 file.jpg
다음 명령을 사용하십시오.
find . -name '. *' -print0 | while read -d $'\0' file; do short_file=${file%jpg}.jpg; mv "$file" "${short_file:4}"; done
설명하다
find
특정 파일 속성(이 경우 파일 이름)과 일치하는 파일 경로를 반환하는 프로그램입니다. 현재 경로의 하위 디렉터리에 어떤 .jpg 파일이 있는지 알고 싶다면 다음을 수행할 수 있습니다 find . -name "*.jpg"
. 일반적으로 이는 각 파일을 새 줄에 출력합니다. 이로 -print0
인해 일치 항목이 null 문자로 구분됩니다. 이를 통해 출력을 다음 명령으로 전달할 때 공백이 있는 파일 이름을 올바르게 처리할 수 있습니다.
이 |
역할을 도관이라고 합니다. 이는 쉘에게 왼쪽 명령의 출력을 가져와서 오른쪽 명령(이 경우 read
루프 내부 명령) 에 입력으로 전달하도록 지시합니다 while
.
이 read
명령은 출력을 가져와 find
변수에 할당하는 데 사용됩니다 file
. 일반적으로 이는 file
각 단어에 한 번에 값을 할당하지만 -d $'\0'$
할당은 널 문자로 구분됩니다( 플래그를 find
사용하여 파일을 구분하는 -print0
방법과 일치 ).
while 루프를 사용하면 read
"file"에 일치하는 각 파일 이름에 대한 값이 반복적으로 할당됩니다. while 루프에 대한 표준 bash 구문의 일부 do
입니다 .done
while <something is true>; do
<run some commands>
done
이 경우 "일부 명령 실행"은 먼저 파일 이름의 확장자를 수정하고 이를 새 변수에 할당합니다 . short_file=${file%jpg}.jpg
그런 다음 파일 이름을 바꾸고 수정된 파일 이름의 시작 부분에서 확장자를 제거합니다 . . filejpg
. file.jpg
mv
.
mv "$file" ${short_file:2}
답변3
다른 답변 대신 그래픽 도구를 사용할 수 있습니다.GP 이름 바꾸기. 문자 바꾸기, 파일 이름 자르기 등을 수행할 수 있습니다. 장점은 이름을 바꾸기 전에 새 파일 이름을 확인할 수 있는 미리보기 기능이 내장되어 있다는 것입니다. 하지만 한 번에 하나의 디렉터리에서만 작동할 수 있기 때문에 하위 폴더 내의 여러 폴더에서 사용하는 것은 불편할 수 있습니다. 하지만 폴더가 10개 미만인 경우에는 문제가 되지 않습니다.