代码之家  ›  专栏  ›  技术社区  ›  Richie Bendall

shell/terminal:使用绝对路径对目录中的所有文件执行命令

  •  1
  • Richie Bendall  · 技术社区  · 8 年前

    我试图对目录中的每个文件执行一个命令,但是使用它们的绝对路径(例如 /home/richi/mydir/myfile.py )而不是它们的相对路径(例如 myfile.py )

    换句话说,我想根据文件的绝对路径对目录中的文件执行一个命令-类似于 for file in *.py; do thecommand -a "$file"; done 但不完全是。

    我之所以这么问是因为我正试图实现一个Travis CI脚本,该脚本在Ubuntu 14.04环境中运行,该环境将安装并使用 pyminifier 以递归方式缩小目录中的所有python代码文件。

    请注意,我的要求可能与 this 但不是。

    1 回复  |  直到 7 年前
        1
  •  0
  •   abarnert    8 年前

    由于您使用的是标准的Linux发行版和完整的用户区,因此您可以使用 realpath 命令:

    打印解析的绝对文件名

    例如:

    $ pwd
    /home/abarnert/src/test
    $ touch 1
    $ realpath 1
    /home/abarnert/src/test/1
    

    就这样。

    如果你不知道如何从内部使用它 bash ,可以使用调用子命令 $(…) 语法:

    $ echo $(realpath 1)
    /home/abarnert/src/test/1
    

    当然,您要将变量的值传递给它 file 但这同样简单:

    $ file=1
    $ echo $(realpath "$file")
    /home/abarnert/src/test/1
    

    我假设你在这里使用bash。有了一个不同的鱼壳,事情会有所不同;有了TCSH或ZSH或FISH或其他什么东西,事情可能会更加不同。


    一个真正的老用户区,或者一个真正的精简用户区(例如,对于嵌入式系统)可能不包括 实路径 . 在这种情况下,您可以使用 readlink 因为GNU版本和通常一样,添加了包括几个厨房水槽在内的所有内容,并且可以用作 实路径 替代品。

    或者,如果最坏的情况变成最坏的情况,python也会 realpath 自2.2起的功能:

    $(python -c 'import os,sys; print(os.path.realpath(sys.argv[1]))' "$file")