2

我正在编写一个简单的 shell 脚本来进行自动备份,我正在尝试使用 basename 创建一个目录列表,然后他们解析这个列表以获取列表中的第一个和最后一个目录。

问题是:当我在终端中使用 basename 时,一切正常,它给了我想要的列表。例如:

basename -a /var/*/ 

给我一个 /var 中所有目录的列表,名称末尾没有 /,每行一个。但是,当我在脚本中使用它并将变量传递给 basename 时,它​​会在变量周围加上单引号:

while read line; do
dir_name=$(echo $line)
basename -a $dir_name/*/ > dir_list.tmp
done < file_with_list.txt

使用 +x 运行时:

+ basename -a '/Volumes/OUTROS/backup/test/*/'

因此,结果不是我需要的。

现在,我知道必须有一千种方法可以解决基本名称问题,但是我什么也学不到,对吧?;)

如何摆脱单引号?如果我的目录名称中有空格?

4

3 回答 3

1

假设您的目标是填充dir_list.tmp在 中列出的每个目录下找到的目录列表file_with_list.txt,这可能会做到。

#!/bin/bash

inputfile=file_with_list.txt
outputfile=dir_list.tmp
rm -f "$outputfile"        # the -f makes rm fail silently if file does not exist

while read line; do

  # basic syntax checking
  if [[ ! ${line} =~ ^/[a-z][a-z0-9/-]*$ ]]; then
    continue
  fi

  # collect targets using globbing
  for target in "$line"/*; do
    if [[ -d "$target" ]]; then
      printf "%s\n" "$target" >> $outputfile
    fi
  done

done < $inputfile

当您开发任何工具来处理您的dir_list.tmp文件时,请注意该文件中的特殊字符(包括空格)。

请注意,我使用printf而不是echo这样,第一个字符是连字符的目标不会导致错误。

于 2012-07-31T15:18:29.253 回答
1

如果您的目录名称可能包含空格,则需要引用的值dir_name(这对于任何变量扩展都是一个好主意,无论您是否需要空格)。

while read line; do
  dir_name=$line
  basename -a "$dir_name"/*/ > dir_list.tmp
done < file_with_list.txt

(正如 jordanm 指出的那样,您不需要引用变量赋值的 RHS。)

于 2012-07-29T01:23:19.800 回答
0

这可能有效

while read; do
  find "$REPLY" >> dir_list.tmp
done < file_with_list.txt
于 2012-07-29T02:23:59.700 回答