Ls
如何將命令輸出(ls)用於其他命令的輸入(sox)?
我有一個包含多個 .wav 文件的文件夾,我試圖按順序連接這些文件,但我認為我對 bash 命令太缺乏經驗,無法盡可能高效地執行此操作。你看,我不知道如何使用文件內容作為命令的輸入:
我以正確的順序獲取所有文件名:
ls *.wav | sort -V > script
腳本:
ep1-s1.wav ep2-s1.wav ep3-s1.wav
我在每行後添加“\”以在命令中使用
lam script -s " \\" > script2
腳本2:
ep1-s1.wav \ ep2-s1.wav \ ep3-s1.wav \
我刪除了最後一個’':
sed '$ s/.$//' script2 > script3
腳本3:
ep1-s1.wav \ ep2-s1.wav \ ep3-s1.wav
現在我想將該文件的內容用於
sox
,例如:sox ep1-s1.wav \ ep2-s1.wav \ ep3-s1.wav output.wav
我怎樣才能做到這一點?
現在,可能有一種方法可以在一個命令中執行此操作,但我無法弄清楚管道是如何工作的:如果你知道怎麼做,我真的很想知道!
就像我在評論中提到的那樣,如果您不需要版本排序 (
sort -V
),您可以簡單地執行sox *wav
. 在 Linux 中,*wav
將進行文件名擴展,產生按字母順序排列的文件名列表。這受您的區域設置影響,尤其是LC_COLLATE
,您可以通過 Google 獲取更多資訊。如果您需要
sort -V
,處理此問題的正確方法是使用以空字元結尾的字元串和數組來處理帶有空格和其他特殊字元的文件名。此腳本會將sort
命令的輸出放入一個數組並sox
使用此列表執行。#!/bin/bash unset wav_files while IFS= read -r -d '' file; do wav_files+=("$file") done < <(find . -maxdepth 1 -type f -name "*wav" -print0 | sort -V -z) if (( ${#wav_files[@]} == 0 )); then echo "No wav files found" else sox -- "${wav_files[@]}" fi
這可能超出您的預期,但這是一種很好的做法;)