2017-04-30 2 views
0

나는 파일을 포함하여 많은 하위 디렉토리가있는 디렉토리가 있습니다. 각 WAV 파일에 대해 파일 시작 부분에 파일 자체의 타임 스탬프를 변경하지 않고 만든 날짜 (WAV 파일을 처음 만든 날짜)를 추가하여 WAV 파일의 이름을 바꾸고 싶습니다.리눅스 : 일괄 파일 이름 변경 생성 날짜 추가

다음 단계는 MP3 파일로 WAV 파일을 변환하는 것이므로 하드 드라이브 공간을 절약 할 수 있습니다.

그 목적을 위해, 나는 bash 스크립트를 만들려고 노력 중이지만 몇 가지 문제가 있습니다.

나는 원래 디렉토리와 동일한 구조를 유지하려는 때문에 내가 좋아하는 뭔가 생각 :

for file in `ls -1 *.wav` 
    do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.wav 
    cp -r --preserve=timestampcp $dir_original/$file $dir_converted/$name 
done 
+1

"마지막 데이터 액세스 시간, 마지막 데이터 수정 시간 및 파일 상태가 마지막으로 변경된 시간"만 있습니다. 어느 것이 필요합니까? * .wav 파일의 파일에 대한 – RomanPerekhrest

+1

을 수행하면 백틱과 ls가 필요하지 않습니다. – codeforester

+0

'man stat'와 다른'stat' 문서를 다시 읽으십시오. 모든 'awk ..'없이 원하는 날짜 문자열을 생성 할 수 있어야합니다. sed .. 물건. 행운을 빕니다. – shellter

답변

0

단지 (쉘이 그들 glob에하자, 파일 이름의 목록을 생성 ls를 사용하지 마십시오 그 ls *.wav)는 어쨌든 무엇이다 :

for file in ./*.wav ; do 

나는 당신이 형식 YYYYMMDD_HHMMSS의 타임 스탬프를 원한다고 생각? 당신은 출력 형식의 다소 깔끔한 제어하도록 stat와 GNU date을 사용할 수

epochtime=$(stat -c %Y "$file") 
name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav 

stat -c %Y (또는 %y)이 마지막으로 수정 한 날짜를 제공합니다,하지만 당신이 정말로 파일의 생성 날짜를 얻을 수 없다 Linux 시스템에서.

cptimestampcp의 끝에있는 cp의 누락을 제외하고는 괜찮아 보이지만 오타가되어야합니다. *.wav을 수행하면 파일 이름이 현재 디렉토리와 관련되어 있으므로 접두어를 사용하지 않고 $dir_original/을 붙일 필요가 없습니다.

전체 하위 디렉토리를 살펴 보려면 Bash의 globstar 기능 또는 find을 사용하십시오. 이런 식으로 뭔가가 :

shopt -s globstar 
cd "$sourcedir" 
for file in ./**/*.wav ; do 
    epochtime=$(stat -c %Y "$file") 
    name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav 
    dir=$(dirname "$file") 
    mkdir -p "$target/$dir" 
    cp -r --preserve=timestamp "$file" "$target/$dir/$name" 
done 

여기에 약간의 불편 cp 경로에있는 디렉토리를 생성 할 수 있다는 것입니다, 그래서 우리는 거기에 mkdir를 사용해야합니다. 또한, 원래 파일 이름을 결과 파일의 일부로 유지하려면이 파일을 제거하고 파일 이름을 타임 스탬프로 바꾸는 지 확실하지 않습니다.