【问题标题】:Linux Bash Script unhiding files in the directoryLinux Bash 脚本取消隐藏目录中的文件
【发布时间】:2014-11-09 16:19:31
【问题描述】:

我正在尝试使用参数 --unhide 创建一个脚本来取消隐藏目录中的文件,但它不起作用。你能帮帮我吗?这是我的部分代码。

for i in `ls -1`
do
    if [ -f $i ] || [ -d $i ]
    then
        if [ `echo $i | cut -c1` == "." ]
        then
            mv $i ${i#.}
        fi
    fi
done

谢谢!

那么取消隐藏然后我写--unhide file1 file2怎么样?

elif [ $1 = --unhide ] && [ ! $2 = --all ]
then
for i in $@
do
if [ -f $i ] || [ -d $i ]
then
if [ `echo $i | cut -c1` == "." ]
then
mv $i ${i#.}
fi
fi
done    

很容易我们没有隐藏文件,然后参数名称与文件名相同。但是如何检查隐藏文件?我试图写 --unhide .file1 .file2 但脚本只取消隐藏 .file1 和 .file2 不。

【问题讨论】:

  • 我想您看到的特定问题是因为 ls -1 默认情况下不包含隐藏文件,但 mattias 有一种更强大的方法来做同样的事情。
  • 如果您不相信使用 ls 来完成这项工作本身就被破坏了,请尝试使用一些包含空格的文件名进行测试......或者更糟糕的是,换行符。

标签: linux bash hidden-files


【解决方案1】:

所以基本上你要求的是一个重命名目录中文件的脚本,其中文件以'.'开头?

类似下面的东西应该可以工作

GLOBIGNORE=".:.."
for file in .*; do
   mv -n "$file" "${file#.}"
done

【讨论】:

  • 出于测试目的,我会在运行完整的mv -n 之前先执行echo $file,但要确保不要做任何愚蠢的事情。
  • 无需导出GLOBIGNORE
  • @YannVernier:在 OSX 上,我得到 '..' 和 '.'不计那条线。所以这就是我包含它的原因。我有点希望他不要尝试重命名那些 :) 但在某些方面你是对的,没有 GLOBIGNORE 它仍然可以工作。
  • @mattias,Yann 并没有告诉你不需要设置 GLOBIGNORE,而是你不需要导出 它。仅GLOBIGNORE='.:..' 而没有export 将具有相同的效果,但副作用更少。
  • @user3168731, ls 是错误的工作工具,即使使用 -a。见mywiki.wooledge.org/ParsingLs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
相关资源
最近更新 更多