
# 造 5 个 目录,每个目录下,造 3 个 文件和两个子目录如下:
cd $HOME/tmp
for i in d1 d2 d3 d4 d5
do
mkdir -p $i
touch $i/1.txt $i/2.txt $i/3.txt
mkdir -p $i/tmp1 $i/tmp2
done
# 检验测试环境:
$ ls -lR d1
total 0
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 2.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 3.txt
drwxr-sr-x 2 wenlee comm256 Dec 22 10:35 tmp1/
drwxr-sr-x 2 wenlee comm256 Dec 22 10:35 tmp2/
# 利用下列脚本来实现你要做的:
cd $HOME/tmp
for i in */1.txt
do
echo "Found $i, save $i and remove everything else under $(dirname $i)/"
save_this_file=$(basename $i)
curr_dir=$(dirname $i)
# 把这个1.txt暂时存到/tmp里面去,为了避免已经有同样的档案名称在/tmp,加上$$ (i.e. PID)
mv $i /tmp/${save_this_file}.$$
rm -rf $curr_dir
mkdir -p $curr_dir
mv /tmp/${save_this_file}.$$ $curr_dir
done
# 屏幕执行输出如下:
Found d1/1.txt, save d1/1.txt and remove everything else under d1/
Found d2/1.txt, save d2/1.txt and remove everything else under d2/
Found d3/1.txt, save d3/1.txt and remove everything else under d3/
Found d4/1.txt, save d4/1.txt and remove everything else under d4/
Found d5/1.txt, save d5/1.txt and remove everything else under d5/
# 复验实验环境:
$ ls -l d?/*
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d1/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d2/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d3/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d4/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d5/1.txt
OK?
thanks!
为了避免目录列举消耗时间过长,请指定一个目录来模拟,命令行参数:代表路径的字符串.如果认可代码,请加分50,谢谢
----
import javax.swing.*
import javax.swing.tree.*
import java.awt.*
import java.io.*
final public class FileTree extends JFrame {
public FileTree(File dir) throws HeadlessException {
super("File Tree")
JTree tree
add(new JScrollPane(tree =new JTree(buildTreeModel(dir))))
tree.setCellRenderer(new FileTreeRenderer())
setSize(400,600)
setVisible(true)
}
private TreeModel buildTreeModel(File dir){
DefaultMutableTreeNode root = new DefaultMutableTreeNode(dir)
walkthrough(dir,root)
return new DefaultTreeModel(root)
}
private static void walkthrough(File f,DefaultMutableTreeNode node){
for (File fle : f.listFiles()) {
DefaultMutableTreeNode n = new DefaultMutableTreeNode(fle)
node.add(n)
if (fle.isDirectory()){
walkthrough(fle, n)
}
}
}
private class FileTreeRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
JLabel cmp = (JLabel)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus)
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode n = (DefaultMutableTreeNode)value
Object obj = n.getUserObject()
if (obj instanceof File) {
File f = (File)obj
cmp.setText(f.getName())
cmp.setForeground(f.isDirectory()?Color.BLUE:Color.BLACK)
}
}
return cmp
}
}
public static void main(String[] args) {
new FileTree(new File(args[0]))
}
}
写一个函数,函数的参数是目录路径字符串函数内使用 ls -s dir_path , 然后for 遍历循环
如果是目录则继续调用自身
如果是文件则答应文件名
从执行优化的角度来讲,可以把判断目录还是文件的代码放在循环外层.
好久没写shell了 ,我这也没环境测试 , 只能给个思路,函数的具体写法自己找一下资料吧.
另外,find命令可以直接完成你要做的事.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)