문제

Linux 서버에서 일련의 파일의 이름을 바꾸려고합니다. 내가 원하는 파일을 찾는 것은 쉽습니다.

find . -type f -wholename \*.mbox

물론 Mbox 파일이기 때문에 일부는 이름에 공간이 있으므로 다음이됩니다.

find . -type f -wholename \*.mbox -print0

파일의 이름을 바꿀 수 있도록 XARGS에 배관하고 있습니다.

find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/}

Echo는 inbox.mbox가 주어진받은 편지함과 같은 것을 반환해야하지만 Bash는 불평합니다.

bash: ${"{}"/.mbox/}: bad substitution

이것을 어떻게 고칠 수 있습니까? 가능한 경우 찾기/xargs 솔루션에 보관하려고 노력하므로 주변에 많은 루핑 구성을 추가하지 않도록합니다.

도움이 되었습니까?

해결책

노력하다

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh

파일 중 일부에 이중 인용 문자가 포함되어 있으면 100% 바보 증거가 아니지만 무시할 수 있다고 가정합니다. :)

다른 팁

GNU 평행 http://www.gnu.org/software/parallel/ 확장을 제거하는 {.}가 있습니다.

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.}

파일 이름에 n이 포함되어 있지 않다는 것을 알고 있다면 이것은 다음과 같습니다.

find . -type f -wholename \*.mbox | parallel mv {} {.}

나는 당신이 이것을 필요로한다고 생각합니다 :

find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }'

(Mawk에서 테스트 된 gawk와 mawk 호환이어야합니다). Xargs를 사용하지는 않지만 이동 한 모든 파일에 대한 새로운 프로세스를 포크하지는 않습니다. 많은 양의 파일을 이동 해야하는 경우 장점이 있습니다. WARRNING : 파일 중 하나라도 이름에 새로운 라인이 포함되어 있으면 곤경에 처할 수 있습니다 (그러나 이것이 문제라면 신은 당신과 함께 있습니다).

XARGS를 사용하여 단일에서 여러 파일을 삭제 하여이 솔루션을 더욱 향상시킵니다. rm 기도.

속도가 정말 필요한 경우 AWK 대신 Python 스크립트를 사용하는 것이 좋습니다. 그것은 모든 일을 할 것입니다 rm단일 포크가 없습니다.

이름 바꾸기 (1)를 사용할 수 있습니까? Perl과 함께 제공됩니다.

당신은 시도 할 수 있습니다:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//'

당신의 문제는 Xargs에 파이프하려고하는 것입니다. 그 시점까지 "{}" 아무 의미가 없습니다.

파일의 이름을 바꾸려면 (Bash 아래에 있다고 가정)

find . -type f -wholename \*.mbox -print0 | \
    while read I ; do
        mv $I $(echo $I | sed 's/\.mbox//') ;
    done ;

여기에가요, 이것은 트릭을해야합니다 ....

# find .
.
./test.tst
./test1.tst
./test2.tst
./test/test4.tst
./test/test5.tst

#

for file in `find . -type f`
do
mv $file ${file%.tst}.new
done

# find .
.
./test
./test/test4.new
./test/test5.new
./test1.new
./test2.new
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top