【问题标题】:bash create dummy files and folders based on real filesbash 基于真实文件创建虚拟文件和文件夹
【发布时间】:2013-01-14 10:18:30
【问题描述】:

所以我需要一个简单的 bash 脚本来根据实际文件夹的内容创建虚拟文件和文件夹。 这是我到目前为止所得到的

dir=/mnt/TV
dummy_dir=/home/bob/Desktop/dummy

for d in `ls $dir`; do
  mkdir "$dummy_dir/$(basename $d)"
done
for f in `ls -a $dir`; do
  touch "$dummy_dir/$(basename $f)"
done

但它不能正常工作..谢谢

【问题讨论】:

  • 你能比“它不能正常工作”更具体吗?
  • 我猜“ls $dir”的输出不是你所期望的。检查你的别名?

标签: bash loops replace


【解决方案1】:

比起`cmd`$(cmd)是新的样式,应该尽量使用,更清晰,也可以嵌套。不过我也不会用。

我怀疑你遇到的问题是你的 mkdir,它要求所有顶级目录在创建基础之前都存在,即

mkdir /tmp/path/here 

要求 /tmp/path 存在,除非您使用 -p 标志,它会创建整个树而不管当前存在什么。

您会发现的另一个问题是隐藏文件和目录将被创建为文件,而非隐藏文件和目录将被创建为目录,无论原始目录中的文件类型如何。

执行此操作的更好方法是使用 find。例如

dir=/mnt/TV
dummy_dir=/home/bob/Desktop/dummy

find $dir -type d -printf '%P\n' | \
    while read dir; do 
        [[ -d "$dummy_dir/$dir" ]] || mkdir -p "$dummy_dir/$dir"
    done

find $dir -type f -printf '%P\n' | \
     while read file; do
        [[ -f "$dummy_dir/$file" ]] || touch "$dummy_dir/$file"
     done

第一个 find 命令将打印出所有属于 $dir 子目录的目录相对于 $dir 的路径。然后将它们传送到 while 循环中,该循环测试该目录是否存在于 dummy_dir 中,如果不存在则创建它。

第二个查找命令将对文件执行相同的操作。

注意:这将完全忽略符号链接套接字或任何其他不是目录或常规文件的文件。

如果这不符合您的要求,请更新您的问题以包含更多详细信息。

【讨论】:

  • 请注意,在您的示例中,如果存在嵌入空格的目录或文件名,它将中断。
  • 谢谢你,这正是我所需要的。我只需要虚拟文件来测试文件重命名脚本。
【解决方案2】:
cp -pvr /mnt/TV /home/bob/Desktop/dummy

如果您想要实现的目标不止于此,请在您的问题中说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 2020-04-14
    • 2018-09-26
    • 2017-02-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多