簡體   English   中英

如何在bash中循環包含通配符的目錄列表?

[英]How to loop over a list of directories containing wildcards in bash?

假設我有一個包含數十年子目錄的目錄:

$ ls -d /very/long/path/*/
adir1/ adir2/ b2dir/ b3dir/ k101/ k102/ k103/ k104/ k220/ k221/ k222/ etc

我想循環選擇一些目錄,這些目錄將根據用戶給出的答案“動態”定義,並且它將包含通配符。 例如(代碼不起作用):

$ cat my_script.sh

DATADIR="/very/long/path"
echo -n "Select dirs to involve: "
read dirlist
for DIR in "$dirlist"; do
  echo $DATADIR/$DIR 
  [do stuff]
  ...
done

可能需要的是以下內容:

$ ./my_script.sh
Select dirs to involve: a* k10?

/very/long/path/adir1
/very/long/path/adir2
/very/long/path/k101
/very/long/path/k102
/very/long/path/k103
/very/long/path/k104

任何提示?

一個可能的解決方案是使用find

#!/bin/bash
DATADIR="/very/long/path"
echo -n "Select matching expression: "
IFS= read -r dirlist
while IFS read -r -d '' DIR; do
  echo "$DIR"
  [do stuff]
  ...
done < <(find "$DATADIR" -path "$dirlist" -print0)

我建議您閱讀find的聯機幫助頁,因為匹配會占用斜線,並且可能不像您習慣使用shell globbing那樣。

請注意,使用-print0read -d''可以確保處理具有有趣名稱(空格,換行符)的文件而不會出現問題。

如果您希望能夠同時處理多個表達式輸入,則必須執行以下操作:

#!/bin/bash
DATADIR="/very/long/path"
echo -n "Select matching expression: "
IFS= read -r -a dirlist_array
for dirlist in "${dirlist_array[@]}" ; do
  while IFS read -r -d '' DIR; do
    echo "$DIR"
    [do stuff]
    ...
  done < <(find "$DATADIR" -path "$dirlist" -print0)
done

不確定這是否會遇到問題,但要給它一個旋轉:

DATADIR="/very/long/path"

read -r -p "Select dirs to involve: " -a dirs

cd $DATADIR

for dir in ${dirs[@]}
do
    echo "$dir"
done

讓陣列不加引號可以使球體擴展。

更新:雙循環允許使用目錄位置

DATADIR="/very/long/path"

read -r -p "Select dirs to involve: " -a dirs

for item in "${dirs[@]}"
do
  for dir in "$DATADIR/"$item
  do
    echo "$dir"
  done
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM