2015-10-18 47 views
2

我想在只有一个文件的文件夹中获取文件名。

FYI:该$FOLDER_TMP包含有空格,这就是为什么我用printf

function nameofkeyfile(){ 
    FOLDER_TMP="${PWD%/*/*}/folder/" 
    FOLDER=$(printf %q "${FOLDER_TMP}") 
    FILENAME=ls "$FOLDER" # Error: No such file or directory 
    # or this: FILENAME=$(ls "$FOLDER") # Error: No such file or directory 
    FNAME=`basename $FILENAME` 
} 

的问题是该行: FILENAME = LS “$文件夹” #错误:没有这样的文件或目录

你知道为什么 - 是的,文件夹在那里吗? 如果我回应$FOLDER它给了我正确的文件夹。

+0

如果你的'find'版本支持'-printf',我建议使用'find“$ FOLDER_TMP”-type f -printf%f' –

回答

2

I am trying to get the filename in a folder with only one file in it.

你确有错误的做法。

而应考虑使用通配符,像这样:

分配

fname=("${PWD%/*/*}"/folder/*) 

将填充阵列fname会给出水珠的扩展:即在该目录"${PWD%/*/*}"/folder/的所有文件,如果有的话。如果根本没有文件,你的数组将包含glob,逐字。

因此,更可靠的方法是这样的:

nameofkeyfile() { 
    fname=("${PWD%/*/*}"/folder/*) 
    # Now check that there's at most one element in the array 
    if ((${#fname[@]} > 1)); then 
     echo "Oh no, there are too many files in your folder" 
     return 1 
    fi 
    # Now check that there is a file 
    if [[ ! -f ${fname[0]} ]]; then 
     echo "Oh no, there are no files in your folder" 
     return 1 
    fi 
    # Here, all is good! 
    echo "Your file is: $fname" 
} 

这使用击(命名)阵列。如果你想要的功能是POSIX兼容的,这是相当简单的,因为POSIX壳有一个未命名的数组(位置参数):

# POSIX-compliant version 
nameofkeyfile() { 
    set -- "${PWD%/*/*}"/folder/* 
    # Now check that there's at most one element in the array 
    if [ "$#" -gt 1 ]; then 
     echo "Oh no, there are too many files in your folder" 
     return 1 
    fi 
    # Now check that there is a file 
    if [ ! -f "$1" ]; then 
     echo "Oh no, there are no files in your folder" 
     return 1 
    fi 
    # Here, all is good! 
    echo "Your file is: $1, I'll store it in variable fname for you" 
    fname=$1 
} 

我没有剥去文件名的完整路径,但是这真的很容易(不要使用basename!):

fname=${fname##*/} 

更确切地说:在Bash版本,你会使用:

fname=${fname[0]##*/} 

,并在POSIX版本,你会使用:

fname=${1##*/} 

使用参数展开得到一个catch基本名称,这是/的情况。但看起来你不会在这种情况下,所以它是安全的!

2

要将输出ls "$FOLDER"存储在一个变量,把它在一个子壳:

FILENAME=$(ls "$FOLDER") 

另一个问题是printf。 它在字符串 中添加了转义反斜杠,当您尝试在下一步中列出目录时,那些反斜杠由字面意义上由shell使用。 所以降printf

function nameofkeyfile() { 
    FOLDER="${PWD%/*/*}/folder/" 
    FILENAME=$(ls "$FOLDER") 
    FNAME=$(basename $FILENAME) 
} 

最后,最好使用$(...)`...`

+0

是的,我的shell朋友 - 谢谢 –

相关问题