Bash
將不同目錄中的文件內容用空行連接起來
我有
dir1.txt
包含以下目錄名稱的文件:2 3 4
目錄 2 包含文件 2_1.txt 和 2_2.txt
目錄 3 包含文件 3_1.txt 和 3_2.txt
目錄 4 包含文件 4_1.txt 和 4_2.txt
每個文件包含兩行。
然後我創建了以下嵌套循環:
#!/bin/bash input="dir1.txt" while IFS=read -r line do for j in "$line/*" do sed -e '$s/$/\n/' $j #cat $j; echo done >> output.txt done < "$input"
基本上,我想在連接的文件之間有一個空行。使用上面的循環,我只在 dir 2 中的最後一個文件內容和 dir 3 中的第一個文件之間得到一個空行,以及 dir 3 中的最後一個文件內容和 dir 4 中的第一個文件,但我也想要一個空行在同一目錄中的文件的連接內容之間。我試過 cat $j; 迴聲(上面註釋掉)但無濟於事。再次嘗試使用嵌套的 for 循環 - 我得到了相同的結果。我認為我的邏輯是錯誤的。
您的邏輯是正確的,但我必須進行一些修改才能使其正常工作。
- 之後添加了一個缺失的空格
IFS
(否則錯誤)- 將引用更改
"$line/*"
為"$line"/*
(否則sed: can't read 2/*: No such file or directory
)- 引用
$j
(只為更好的風格)
sed
和版本都cat/echo
做他們應該做的。#!/bin/bash input="dir1.txt" while IFS= read -r line do for j in "$line"/* do sed -e '$s/$/\n/' "$j" #cat "$j"; echo done >> output.txt done < "$input"
如有疑問,請使用註釋和 stderr 輸出。
此外,您的腳本的某些方面在 GNU bash 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu) 上對我不起作用
#!/bin/bash input=dir1.txt # Cycle through input for dir in $(cat $input) do # Prints to stderr (echo "INFO - Dir: $dir" 1>&2) # Is dir a directory? if [ -d $dir ] then # Cycle through files for file in $dir/* do # Prints to stderr (echo "INFO - File: $file" 1>&2) # Print contents cat $file # Blank line. echo done fi done >> output.txt