English 中文(简体)
通过剪辑复制目录结构
原标题:copying a directory structure via shell scripts

I have a directory structure in my machine as following

 bhagwat        durga    Sai Baba    vishnu sahastranam
  bhagwat geeta  hanuman  ramayan audio  shiv      vishnu

in this all of the above are directories which have blank spaces in their names. i.e if you do an ls -l you will see following

drwx------ 1 deel deel        0 2011-09-12 21:34 bhagwat
drwx------ 1 deel deel     8192 2011-09-09 22:35 bhagwat geeta
drwx------ 1 deel deel     4096 2011-10-07 05:10 durga
drwx------ 1 deel deel        0 2011-10-29 09:23 hanuman
drwx------ 1 deel deel     8192 2011-09-30 22:48 ramayan audio
drwx------ 1 deel deel     4096 2011-09-18 12:16 Sai Baba
drwx------ 1 deel deel     4096 2011-09-26 19:19 shiv
drwx------ 1 deel deel     4096 2011-09-26 19:20 vishnu
drwx------ 1 deel deel     4096 2011-09-16 11:35 vishnu sahastranam

which has further sub folders in it.I DO NOT want to copy the files or directories. I want to create a directory structure as above on some other location or device.Which is analogous to what exist on source directory. Hence I am writing a script for the same as follows

#!/bin/bash
for i in `ls /media/New Volume/bhajans`;do
echo $i 
done

现在,这一办法的问题在于它导致产出的完成。

bhagwat
bhagwat
geeta
durga
hanuman
ramayan
audio
Sai
Baba
shiv
vishnu
vishnu
sahastranam

如果你注意到该产出,则以名录为名称的空白处作为单独的名录处理。 这不是正确的。 因此,我如何能够消除这一问题。 我想创建与来源组合相同的目录结构。

EDIT
I am using Ubuntu 11.04
UPDATE
Each of the sub directory which was cloned has a script named script.sh so not only I am cloning the directory structure.I am also copying the script.sh from parent directories to the cloned destinations. Kevin and Jonathan thanks for your explanations and answers.

最佳回答

用<代码>olddir到newdir的名录结构(再现):

find olddir -type d -printf "newdir/%P" | xargs -0 mkdir -p

如果你只想达到第一级,则在<条码>上添加<条码>-深度1。

解释:

<代码>find, 当然,可追溯查询目录,并在查阅的档案上采取行动。 称号为“旧代谢”的目录中注明,“”的目录中注明该目录只应在名录上操作。 兹将其印成如下格式:newdir<>code>是你想要打上结构的目录。 。 这种无效性质将使我们能够将任何法律档案名称通过至<条码>xargs () 否则它将使用白色空间,我们知道我们不想这样做。 <代码>-p > 系指在尚未建立母体名录的情况下制作母体名录的<代码>mkdir。

“科索沃”,每份档案的复印件都是比照的,但我很相信,在你把结构与上述指挥相隔之后,所有案件(所有安装了兼容的[核心]发现的案件)都将如此。

$ find olddir -name script.sh -printf "%p" -printf "newdir/%P" | xargs -0L2 cp -n

第一个<代码>f印刷了源(现有)文档(),第二版印刷了目的地档案。 两者都如我们先前所做的那样,在<条码>上。 <代码>xargs,-L2的新论点表明,xargs,在提出意见时,先提出两(2)个论点(档案),使每一指挥只掌握其中两个。 因此,<编码>印本/编码>说明和<代码>L2的次序非常重要。 <代码>-n指cp,如存在,则不超出目的地,就在我们当中一人犯错误。

问题回答

提 出

find . -maxdepth 1 -type d | xargs -I X mkdir  /new/directory/X 

处理最初错误。

类似情况:

while IFS=$
 read -r i; do 
    echo "$i"; 
done < <(ls -1 /media/New Volume/bhajans)

正如你指出的那样,问题显然是,沥青把名录中的位置作为划界者对待,并逐字分开处理。 “权利”解决办法是告诉它不要这样做,但在没有这样做的情况下,这里会sil地工作!

#!/bin/bash
for i in `ls -F | grep "/$" | sed s/ /###/g`;do
    echo $i | sed s/"###"/ /g
done

First of all, the ls -F | grep "/$" part filters your ls results to only return directories and not files (or symlinks). Then, the sed command translates the spaces in your directory names into a placeholder string ("###"), which bash no longer mistakes for a delimiter. Inside the loop, the reverse sed command translates them back into space characters.

当然,你可以用你想要的非白色空间特性取代“#”。

现在,利用这来创建名录:

#!/bin/bash
for i in `ls -F | grep "/$" | sed s/ /###/g`;do
    tempname=`echo $i | sed s/"###"/ /g`
    mkdir "otherlocation/$tempname"
done

仅用你希望用于新目录的道路取代“其他地点”。

如果它必须成为手稿,那就是一种轻视。 如果它可以成为从炮弹中抽取的文字,那么Perl或Adhur可能会更好地为你的目的服务。

Answer Pair 2

这些答复设立了现有工作名录中一些边远名录。 这是问题所要求的。

Shell

rel=“nofollow”find ><>>>>xargs ; POSIX http://pubs.opengroup.org/onlinepubs/96999999/1979/utilgarcode.

(cd "/media/New Volume/bhajans"; find . -maxdepth 1 -type d -print0) |
     xargs -0 mkdir -p

这确保了<代码>find中所列姓名尽可能简单(/name1,等等),但产出包括<代码>、和mkdir .因名录存在而失效。 使用<条码>mkdir-p,即为错误。

注:-print0-print 0有很大不同。 前者是特别指挥,是<编码>-印有/编码>的变式,指令至find。 它不是用一个空间或一条新线确定名称,而是用ASCII NUL终止名称。 这是全球团结联盟的延伸。 在256种可能性中,只有两种特性不能出现在目录上。 其中一项是<代码>/,因为它被用作一条途径分离器;另一项是ASCII NUL。 通过在《刑法》中确定ASCII NUL(所谓的;其星号为零)的名称,姓名彼此明确分开。 但是,它确实需要一些方案,期望这项公约发挥作用;例如,必须修改<条码>xargs,以承认该公约。

当你写到<条码>-0时,你对<条码>限定的<>条码/代码>进行印刷,然后在清单中添加另一个目录(“<条码>0),该目录应加以搜索,并对此表示反对。

当你写到<条码>-printf 0时,你告诉你,要打印一个<0>条码/代码>。 每当它发现档案时,就这样做了。 它增加了新的条线或空间(请上)。 看到了一个含有<代码>0000<<<>>>>>>>>的线,然后按您的要求,将这一条线作为次子。

Perl

This becomes, if anything, slightly easier:

use strict;
use warnings;
my $otherdir = $ARGV[0];

die "$otherdir is not a directory" unless -d $otherdir;

opendir(my $dir, $otherdir) or die "failed to open directory $otherdir";
while (my $name = readdir($dir))
{
    next if $name eq "." || $name eq "..";
    mkdir $name if (-d $file);
}
closedir($dir);

This simply reads the names from the remote directory and creates those directories under the current directory.

Answer Pair 1

这些答复设立了一些偏远名录中现有工作名录。 问题正好相反(但这是我自动做事的方式)。

Shell

rel=“nofollow”find ><>>>>xargs ; POSIX http://pubs.opengroup.org/onlinepubs/96999999/1979/utilgarcode.

find . -maxdepth 1 -type d -print0 |
    (cd /SomeWhere/Else; xargs -0 mkdir)

Perl

use strict;
use warnings;
my $otherdir = $ARGV[0];

die "$otherdir is not a directory" unless -d $otherdir;

opendir(my $dir, ".") or die "failed to open current directory";
while (my $name = readdir($dir))
{
    mkdir "$otherdir/$name" if (-d $file);
}
closedir($dir);

没有正式测试。

You can try

#!/bin/bash
for i in ls /media/New Volume/bhajans/* ;do
echo $i 
done




相关问题
Parse players currently in lobby

I m attempting to write a bash script to parse out the following log file and give me a list of CURRENT players in the room (so ignoring players that left, but including players that may have rejoined)...

encoding of file shell script

How can I check the file encoding in a shell script? I need to know if a file is encoded in utf-8 or iso-8859-1. Thanks

Bash usage of vi or emacs

From a programming standpoint, when you set the bash shell to use vi or emacs via set -o vi or set -o emacs What is actually going on here? I ve been reading a book where it claims the bash shell ...

Dynamically building a command in bash

I am construcing a command in bash dynamically. This works fine: COMMAND="java myclass" ${COMMAND} Now I want to dynamically construct a command that redirectes the output: LOG=">> myfile.log ...

Perform OR on two hash outputs of sha1sum

I want perform sha1sum file1 and sha1sum file2 and perform bitwise OR operation with them using bash. Output should be printable i.e 53a23bc2e24d039 ... (160 bit) How can I do this? I know echo $(( ...

Set screen-title from shellscript

Is it possible to set the Screen Title using a shell script? I thought about something like sending the key commands ctrl+A shift-A Name enter I searched for about an hour on how to emulate ...

热门标签