分页: 2 / 2

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-07-28 9:26
aerofox
lucky_yjw 写了:
bones7456 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
我就直说算了,我想递归比较两个目录之间的文件.
这样好,有个直接的命令,大概是 dircmp 吧,用它就行了。

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-07-28 23:02
lucky_yjw
aerofox 写了:
lucky_yjw 写了:
bones7456 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
我就直说算了,我想递归比较两个目录之间的文件.
这样好,有个直接的命令,大概是 dircmp 吧,用它就行了。
没有这命令啊?我是用diff来比较的,但是它好像不支持递归比较!

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-07-30 20:45
aerofox
是 dirdiff,默认没安装,源里有的。

代码: 全选

DIRDIFF(1)                                                                                                     DIRDIFF(1)

NAME
       dirdiff - display differences and merge changes between directory trees

SYNOPSIS
       dirdiff  [-a|--all] [-o|--only pattern] [-I|--ignore pattern] [-r|--rcs] [-t|--bktag] [-c|--context num] [-b] [-w]
       [-B] [-i] [-d] [-S] [-k] dir1 dir2 ...

OPTIONS
       -a,--all
              Don't exclude any files.

       -o,--only pattern
              Only process files matching pattern.

       -I,--ignore pattern
              Don't process files matching pattern.

       -r,--rcs
              Ignore differences in RCS strings.

       -t,--bktag
              Ignore differences in Bitkeeper strings.

       -c,--context num
              Set number of lines of context to show.

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-07-31 14:35
lucky_yjw
aerofox 写了:是 dirdiff,默认没安装,源里有的。

代码: 全选

DIRDIFF(1)                                                                                                     DIRDIFF(1)

NAME
       dirdiff - display differences and merge changes between directory trees

SYNOPSIS
       dirdiff  [-a|--all] [-o|--only pattern] [-I|--ignore pattern] [-r|--rcs] [-t|--bktag] [-c|--context num] [-b] [-w]
       [-B] [-i] [-d] [-S] [-k] dir1 dir2 ...

OPTIONS
       -a,--all
              Don't exclude any files.

       -o,--only pattern
              Only process files matching pattern.

       -I,--ignore pattern
              Don't process files matching pattern.

       -r,--rcs
              Ignore differences in RCS strings.

       -t,--bktag
              Ignore differences in Bitkeeper strings.

       -c,--context num
              Set number of lines of context to show.
要下载啊,晕...我本想编一个通用的。顺便问一下,它能递归比较吗?

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-25 11:56
lucky_yjw
tubunu 写了: 可以的,上面定义的匹配模式是从开始找任意个非空格字符再加任意个空格字符,然后重复8次,再输出后面的所有字符,例如:
drwxr-x--- 2 xxx staff 256 Jul 24 05:18 test 1
'drwxr-x--- ','2 '等都是符合模式的,第8次就是'05:18 ',再输出后面的所有,就是目录名了。由于ls -l的输出是规范的,可以这样做。
谢了,我的输出目录可能与你的不太一样,应该重复7遍:

代码: 全选

drwxr-xr-x 2 ubuntu ubuntu  4096 2009-09-25 11:21 asd  ty fg sdrte et bg st gsdf dfger dfg erg dfg ert egre    t ert  ert 
drwxr-xr-x 7 ubuntu ubuntu  4096 2009-09-24 17:37 C example
drwx------ 2 root   root   16384 2009-09-24 11:25 lost+found
不过没关系,我自己搞懂后修改了一下命令,呵呵:

代码: 全选

ls -la|grep ^d|sed 's/^\([^ ]* *\)\{7\}//'
.
..
asd  ty fg sdrte et bg st gsdf dfger dfg erg dfg ert egre    t ert  ert 
C example
lost+found
还有就是怎么把带空格的文件夹名传到for参数里?

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-25 20:42
aerofox
dirdiff 可以递归比较。

不要用 ls 加管道的方式还选择目录,那样很难处理带特殊字符的名字。对当前目录下所以子目录作处理:

代码: 全选

for f in *; do
    if [ -d "$f" ]; then
        ....
    fi
done

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-25 20:46
BigSnake.NET
lucky_yjw 写了:
aerofox 写了:
lucky_yjw 写了:
bones7456 写了:
aerofox 写了:用 ls 加管道是最坏的选择,得自己处理各种各样的特殊符号问题。

代码: 全选

for f in *; do echo "$f"; done
这个例子没处理隐藏文件,如果确实要处理隐藏文件,可以用 .[^.]* 来匹配。
嗯,用find + -exec 就更强大了.
我就直说算了,我想递归比较两个目录之间的文件.
这样好,有个直接的命令,大概是 dircmp 吧,用它就行了。
没有这命令啊?我是用diff来比较的,但是它好像不支持递归比较!
diff -r

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-25 22:12
darkfish
最先问的问题可以这样解决

代码: 全选

IFS_OLD=$IFS      #IFS备份
IFS=:
for file in $(find -type d -printf "%p$IFS")
do
      echo "$file"
      echo -------
done
:em11 :em11 :em11

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-26 11:49
aerofox
darkfish 写了:最先问的问题可以这样解决

代码: 全选

IFS_OLD=$IFS      #IFS备份
IFS=:
for file in $(find -type d -printf "%p$IFS")
do
      echo "$file"
      echo -------
done
:em11 :em11 :em11
文件名中带冒号怎么办?

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-27 17:16
darkfish
aerofox 写了:
darkfish 写了:最先问的问题可以这样解决

代码: 全选

IFS_OLD=$IFS      #IFS备份
IFS=:
for file in $(find -type d -printf "%p$IFS")
do
      echo "$file"
      echo -------
done
:em11 :em11 :em11
文件名中带冒号怎么办?
再改个其他的东西吧……这样的逻辑走下去,好像没有什么完美的解决办法……

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-27 18:12
O_O_BOT
while IFS= read -r -d $'\0' file; do
a[i++]="$file"
done < <(find /tmp -type f -print0)
命令扩展

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-27 22:02
darkfish
O_O_BOT 写了:while IFS= read -r -d $'\0' file; do
a[i++]="$file"
done < <(find /tmp -type f -print0)
命令扩展
我靠,牛人……
怎么练就这身本事的?

为什么这里用了print0,而在读入的时候用'\0'作分割符?
print0不是用一个空字符来代替print的换行符吗?

while循环在干什么?

< < 又是什么??

read -d之后要$干什么?

在这里向高人请教则个。 :em06 :em06 :em06

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-27 22:58
aerofox
如果安个 zsh,可以很简单:

代码: 全选

#!/bin/zsh
for f in **/*(.); do
    echo "$f"
done

Re: 如何把带空格的文件夹名字作为 for 的参数列表

发表于 : 2009-09-28 8:03
O_O_BOT
O_O_BOT 写了:while IFS= read -r -d $'\0' file; do
a[i++]="$file"
done < <(find /tmp -type f -print0)
命令扩展
<(find /tmp -type f -print0) 此为 进程替换 命令输出 通过fd 连接 你把他当文件就是了
不用 | 是因为 两边有 子shell, 子的变量影响不了 父shell

其他 -d 是read的flag 无特别, $''是bash的 特殊字符扩展
IFS= 是为read 准备的 保证read 不忽略 什么东西

最后 结果就是 每个文件名 是数组的 一个元素 文件名 可以有任何合法字符\n space ....